C++ std::string和int的串联导致移位。为什么? 今天,当我尝试用一个int来连接一个STD::string时,我感到惊讶。 包括 包括 void printcont std::字符串和文本 { std::cout
这条线就是问题所在:C++ std::string和int的串联导致移位。为什么? 今天,当我尝试用一个int来连接一个STD::string时,我感到惊讶。 包括 包括 void printcont std::字符串和文本 { std::cout,c++,string,c++11,concatenation,C++,String,C++11,Concatenation,这条线就是问题所在: print("iteration_" + 1); 字符串文字正在衰减为字符*。您正在将1添加到此字符*,并将其移动到下一个字符 如果要将字符串1添加到文本的末尾,一种相当简单的方法是将字符串文本传递给std::string构造函数,并手动将1转换为字符串。例如: print(std::string("iteration_") + std::to_string(1)); 这条线就是问题所在: print("iteration_" + 1); 字符串文字正在衰减为字符*。
print("iteration_" + 1);
字符串文字正在衰减为字符*。您正在将1添加到此字符*,并将其移动到下一个字符
如果要将字符串1添加到文本的末尾,一种相当简单的方法是将字符串文本传递给std::string构造函数,并手动将1转换为字符串。例如:
print(std::string("iteration_") + std::to_string(1));
这条线就是问题所在:
print("iteration_" + 1);
字符串文字正在衰减为字符*。您正在将1添加到此字符*,并将其移动到下一个字符
如果要将字符串1添加到文本的末尾,一种相当简单的方法是将字符串文本传递给std::string构造函数,并手动将1转换为字符串。例如:
print(std::string("iteration_") + std::to_string(1));
字符串是否因某种原因被转换为char[]
实际上是另一种方式。迭代是一个字符[11],当您添加1时,它会衰减为常量字符*。指针递增1会使其指向字符串中的下一个字符。然后,这将用于构造一个临时std::字符串,该字符串包含除第一个字符以外的所有字符
您链接的文档是针对运算符+of std::string的,但要使用它,您首先需要一个std::string
字符串是否因某种原因被转换为char[]
实际上是另一种方式。迭代是一个字符[11],当您添加1时,它会衰减为常量字符*。指针递增1会使其指向字符串中的下一个字符。然后,这将用于构造一个临时std::字符串,该字符串包含除第一个字符以外的所有字符
您链接的文档适用于运算符+of std::string,但要使用它,您首先需要一个std::string。如果您尝试使用以下内容: std::string str=iteration+1; 编译器将抛出警告: 警告:向字符串添加“int”不会附加到字符串 [-Wstring+int] 这是因为您将迭代字符串的指针递增1,这意味着现在将迭代字符串分配给str变量 连接的正确方法是: std::string str=iteration+std::to_string1;
如果您尝试使用以下各项: std::string str=iteration+1; 编译器将抛出警告: 警告:向字符串添加“int”不会附加到字符串 [-Wstring+int] 这是因为您将迭代字符串的指针递增1,这意味着现在将迭代字符串分配给str变量 连接的正确方法是: std::string str=iteration+std::to_string1; 迭代不是std::string,而是const char[],它会衰减为const char*,迭代1只执行指针算术,并将指针移动到下一个字符,即“t”,然后得到c样式的字符串变形 您可以使用将int转换为std::string,然后将它们连接起来
print("iteration_" + std::to_string(1));
对于这种情况,调用第一个参数迭代,隐式地将其转换为std::string,然后传递给运算符+,然后将连接的std::string传递给print
迭代不是std::string,而是const char[],它会衰减为const char*,迭代1只执行指针算术,并将指针移动到下一个字符,即“t”,然后得到c样式的字符串变形
您可以使用将int转换为std::string,然后将它们连接起来
print("iteration_" + std::to_string(1));
对于这种情况,调用第一个参数迭代,隐式地将其转换为std::string,然后传递给运算符+,然后将连接的std::string传递给print
表达式迭代_u1+1是添加到int 1的常量字符[11]文本
在该表达式中,迭代分解为指向数组第一个元素的const char*指针。+1然后在该指针上的指针算术中发生。整个表达式计算为指向第一个t的const char*类型,该t是std::string构造函数的有效NUL终止输入!匿名临时std::string绑定指向const std::string和function参数
这是完全有效的C++,有时可以很好的使用。 如果要将+视为串联,则
print("iteration_" + std::to_string(1));
是单向的。表达式迭代+1是添加到int 1的常量字符[11]文本
在该表达式中,迭代分解为指向数组第一个元素的const char*指针。+1然后在该指针上的指针算术中发生。整个表达式计算为指向第一个t的const char*类型,该t是std::string构造函数的有效NUL终止输入!匿名临时std::string绑定指向const std::string和function参数
这是完全有效的C++,有时可以放进去。 od使用
如果要将+视为串联,则print("iteration_" + std::to_string(1));
是一种方法。@idclev463035818在发布后才意识到我的错误,更正了,谢谢:为什么是std::string构造函数?不是打印迭代+标准::到字符串1;够了吗?@DominikMokriš只是倾向于显式:@idclev463035818在发布后才意识到我的错误,更正了,谢谢:为什么使用std::string构造函数?不是打印迭代+标准::到字符串1;够了吗?@DominikMokriš只是一个显式的偏好:是的,你必须将1转换为字符串才能将其附加到字符串中。其他语言在你背后进行各种转换;C++通常试图使这类事情显式化,以便更容易理解代码实际上在做什么。是的,必须将1转换为字符串,以便将其附加到字符串。其他语言在你背后进行各种转换;C++通常试图使这类事情显式化,以便更容易理解代码实际上在做什么。