当我用GCC编译它时:
struct A
{
A();
A(const A &);
A(A &&) = delete;
};
void ugh(A);
A bar()
{
A a;
ugh(a);
return(a);
}
我收到错误:
x.cpp: In function ‘A bar()’:
x.cpp:14:13: error: use of deleted function ‘A::A(A&&)’
return(a);
^
x.cpp:5:5: note: declared here
A(A &&) = delete;
^
实际上,将return语句中的a视为rvalue(因为它即将被销毁)是有意义的。但是,标准是否要求rvalues是匿名的?
另外,即使在这种情况下允许使用移动构造函数,为什么还需要它?为什么编译器不能使用复制构造函数,因为移动构造函数不可用?
他之前的问题Does returning a local object require move semantics?的答案主要针对我的问题,但是没有涉及命名变量如何成为没有调用std :: move()的右值。
编辑:这两个链接解释了为什么gcc的行为是正确的,并阐明了为什么标准要求这种行为: Why do C++11-deleted functions participate in overload resolution? http://en.cppreference.com/w/cpp/language/return