3

I am quite puzzled by the std::move stuff. Assume I have this piece of code:

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

string s = foo();

How many times the string constructor is called? Is it 2 or 3? Is the compiler going to use move for this line?

string s = foo();

If so, in the function I am not even returning rvalue reference, so how could the compiler invoke the move constructor?

4

1 回答 1

4

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

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

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

如果是这样,在函数中我什至没有返回右值引用,那么编译器如何调用移动构造函数?

您似乎在&&“移动”的误解下苦苦挣扎,如果没有&&某个地方,那么移动就不会发生。或者移动构造需要move,这也是不正确的。

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

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

的返回值foo是临时的。C++ 的规则要求临时对象绑定到&&参数 before const&。所以你把建筑搬进s.

于 2013-09-05T03:51:31.970 回答