eca*_*mur 13 c++ return comma-operator move-semantics c++11
这个程序:
#include <iostream>
struct T {
T() {}
T(const T &) { std::cout << "copy constructor "; }
T(T &&) { std::cout << "move constructor "; }
};
int main() {
([](T t) -> T { return t; })({}); std::cout << '\n';
([](T t) -> T { return void(), t; })({}); std::cout << '\n';
([](T t) -> T { return void(), std::move(t); })({}); std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)
当由gcc-4.7.1输出编译时(链接):
move constructor
copy constructor
move constructor
Run Code Online (Sandbox Code Playgroud)
为什么逗号运算符有这种效果?标准说:
5.18逗号运算符[expr.comma]
1 - [...]结果的类型和值是右操作数的类型和值; 结果与右操作数[...]具有相同的值类别.如果右操作数的值是临时值,则结果是临时值.
我是否遗漏了允许逗号运算符影响程序语义的内容,或者这是gcc中的错误?
Xeo*_*Xeo 14
自动移动基于复制省略的资格:
§12.8 [class.copy] p32
当满足或将满足复制操作的省略标准时,除了源对象是函数参数这一事实,并且要复制的对象由左值指定,重载决策选择复制的构造函数是首先执行,好像对象是由右值指定的.[...]
当返回表达式是自动对象的名称时,允许依次复制elision .
§12.8 [class.copy] p31
在
return具有类返回类型的函数的语句中,当表达式是具有与函数返回类型相同的cv-unqualified类型的非易失性自动对象(除函数或catch子句参数之外)的名称时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作
插入逗号运算符后,表达式不再是自动对象的名称,而只是对一个表达式的引用,这会抑制复制省略.