C++ 构造函数被调用了多少次?

C++ 构造函数被调用了多少次?,c++,c++11,constructor,move-semantics,C++,C++11,Constructor,Move Semantics,我对这些东西很困惑。假设我有这个 一段代码: string foo() { string t = "xxxx"; return t; } string s = foo(); 字符串构造函数被调用了多少次?是2点还是3点? 编译器将对这一行使用move吗 string s = foo(); 如果是这样,在函数中我甚至没有返回右值引用,那么 编译器调用移动构造函数?它取决于编译器。在这种情况下,标准要求至少有一个构造函数调用。即t的构造 但该标准允许另外两种可能性:从t移动foo的值输

我对这些东西很困惑。假设我有这个 一段代码:

string foo() {
  string t = "xxxx";
  return t;
}

string s = foo();
字符串构造函数被调用了多少次?是2点还是3点? 编译器将对这一行使用move吗

string s = foo();
如果是这样,在函数中我甚至没有返回右值引用,那么
编译器调用移动构造函数?

它取决于编译器。在这种情况下,标准要求至少有一个构造函数调用。即
t
的构造

但该标准允许另外两种可能性:从
t
移动
foo
的值输出结构,以及从
foo
的值输出移动
s
。大多数体面的编译器会放弃这些构造函数,直接在
s
的内存中构造
t
。这种优化之所以成为可能,是因为标准允许在编译器选择不调用这些构造函数时不调用这些构造函数

这称为复制/移动“省略”

如果是这样,在函数中我甚至不返回右值引用,那么编译器如何调用move构造函数呢

你似乎误解了
&
的意思是“移动”,如果某处没有
&
,那么移动就不会发生。或者移动构造需要
移动
,这也是不正确的

C++是以这样一种方式指定的,即在某些位置的某些类型的表达式被认为是有效的。这意味着在绑定到
&
参数之前,值或引用将尝试绑定到
&&
参数。例如,临时变量将优先绑定到
常量&
之前的
&&
参数。这就是为什么用于构造该类型值的临时变量将从

如果函数返回某种类型的值
T
,且返回表达式的形式为
return x
,其中
x
是自动存储持续时间
T
类型的命名变量(即:函数参数或堆栈变量),然后,标准要求此返回表达式move从
x
构造返回值


foo
的返回值是临时值。C++的规则要求临时代码在 CONST和之前绑定到<代码>和> /COD>参数。因此,你可以将构造移到
s

中,如果我们假设编译器没有进行任何优化,会怎么样?@WhatABeautifulWorld:那么它将是我所说的将发生的一个构造函数,加上我所说的两个可选构造函数。我必须更改foo的函数定义才能移动它吗?我在想:string&&foo(){…}否则编译器怎么会知道呢?String只是一个例子,实际上我有自己的obj…@WhatABeautifulWorld NO。永远不要返回右值引用。RValk引用是引用,而C++中,您不允许返回对本地变量的引用。右值引用仍然是引用;它们不是魔法。