编译器会使用move构造函数来移动即将超出范围的命名变量吗



考虑函数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&&,它不能绑定到左值。

编译器可以进行任何优化,这不会影响程序的副作用。这被称为好像规则。这个规则很少有例外,复制省略就是其中之一。复制省略的规则不适用于您的示例,因此编译器不允许通过优化来更改程序的副作用。您的程序将执行,就好像调用了复制构造函数一样。

相关内容

  • 没有找到相关文章

最新更新