如果C++函数的返回类型是T,那么返回类型T的局部变量是否有效地使变量成为rvalue?

Wal*_*ltK 5 c++ c++11

当我用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