我在某处发现了以下代码,我想知道它是否合法在C ++中。 ret变量是堆栈变量,一旦foo返回分配给ret的内存不再存在。但是string是一个类,我认为复制构造函数被调用来将ret的内容复制到var。这是真的?以下是一段有效的代码吗?
string foo(int x)
{
string ret;
//some operation on ret
return ret;
}
string callingFunc()
{
string var = foo(2);
// some operation on var
}
答案 0 :(得分:5)
是的
实际构建了3个对象:由于ret
而导致string ret;
,由于return ret;
导致临时,var
由所提到的返回临时值构建。
编译器可能会直接从var
优化临时构建ret
。
答案 1 :(得分:0)
代码不合法:callingFunc()
被声明为返回std::string
但未返回任何内容。如果调用此函数并且没有异常退出,则会出现未定义的行为。
函数foo()
是正确的,但是:您可以按值返回局部变量。从概念上讲,它们将被复制(或移动,这是一个类似于复制构造函数的构造函数,但指示复制的对象将消失,并且可以在结果中更改其内容),在return
- 语句之前功能存在。但是,当直接返回变量时,允许编译器忽略该副本(基本上,该对象直接构造在预期返回值的位置,不需要复制)。