我使用下面的代码来测试复制省略:
class foo
{
public:
foo() {cout<<"ctor"<<endl;};
foo(const foo &rhs) {cout<<"copy ctor"<<endl;}
};
int g(foo a)
{
return 0;
}
int main()
{
foo a;
g(std::move(a));
return 0;
}
我原本以为只会调用默认构造函数,因为 g()
的参数是右值,会进行复制省略。但结果显示既调用了默认构造函数也调用了拷贝构造函数。为什么?
如果我将函数调用改为 g(foo())
,则拷贝将被省略。 foo()
和 std::move(a)
的返回类型有何区别?如何使编译器在左值上省略拷贝?
g
按值获取其参数,因此编译器必须确保传递的对象与调用范围内可访问的任何对象都不同。如果传递的对象是左值,则没有临时对象需要消除,也不能省略复制。 - CB Baileystd::move
的实际作用。点击此处。 - fredoverflow