当我用GCC编译时:
struct A
{
A();
A(const A &);
A(A &&) = delete;
};
void ugh(A);
A bar()
{
A a;
ugh(a);
return(a);
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
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;
^
Run Code Online (Sandbox Code Playgroud)
实际上,将return语句中的a视为rvalue(因为它即将被销毁)确实是有意义的.但是,标准是否要求rvalues是匿名的?
此外,即使在这种情况下允许使用移动构造函数,为什么还需要它?为什么编译器不能使用复制构造函数,因为移动构造函数不可用?
他之前的问题的答案,返回本地对象是否需要移动语义?,主要解决我的问题,但不要触及命名变量如何成为没有调用std :: move()的右值.
编辑:这两个链接解释了为什么gcc的行为是正确的,并阐明了为什么标准需要这种行为: 为什么C++ 11删除的函数参与重载解析? http://en.cppreference.com/w/cpp/language/return
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |