考虑函数void foo((和类myclass
class myclass { /* some data members, including pointers, and a move constructor */ };
void foo()
{
myclass myvar = myclass(...); // foo() allocates space on the stack for sdlv
// then passes address in %rdi to constructor
/* myvar is used a few times */
myclass myvar_copy = myvar; // myvar used for the last time
return;
}
myvar是一个左值,但当它最后一次使用时,它也可能是对右值(&&(的引用。C++编译器将检测典型的&;通过识别(x*y(是临时对象。C++编译器(比如gcc(是否也会明智地知道在上面的例子中使用move构造函数?
myclass myvar_copy = myvar;
是复制初始化,其中myvar
是左值。复制构造函数具有类型为const myclass&
的参数,移动构造函数具有类型myclass&&
的参数。
现在,由于我们传递的参数是myvar
,它是一个左值,所以只能使用复制构造函数,因为移动构造函数参数是myclass&&
,它不能绑定到左值。
编译器可以进行任何优化,这不会影响程序的副作用。这被称为好像规则。这个规则很少有例外,复制省略就是其中之一。复制省略的规则不适用于您的示例,因此编译器不允许通过优化来更改程序的副作用。您的程序将执行,就好像调用了复制构造函数一样。