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

时间:2016-11-15 02:16:08

标签: c++ c++11

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

0 个答案:

没有答案