相关疑难解决方法(0)

为什么在返回从函数返回类型派生的类型的本地对象时,不会选择移动构造函数?

以下代码被ClangGCC(主干版本)拒绝:

#include <memory>

struct Base 
{
    Base() = default; 
    Base(Base const&) = delete;
    Base(Base&&) = default;
};

struct Derived : Base
{
    Derived() = default; 
    Derived(Derived const&) = delete;
    Derived(Derived&&) = default;
};    

auto foo()
    -> Base
{
    Derived d;    
    return d;   // ERROR HERE
}
Run Code Online (Sandbox Code Playgroud)

导致以下错误:

prog.cc: In function 'Base foo()': prog.cc:21:12: error: use of deleted function 'Base::Base(const Base&)'
     return d;
            ^
Run Code Online (Sandbox Code Playgroud)

根据[class.copy]/32:

当满足复制/移动操作的省略标准时,但不满足异常声明,并且要复制的对象由左值指定,或者当返回语句中的表达式是(可能带有括号的)id-时表达式,用于在最内层封闭函数或lambda-expression的body或parameter-declaration-clause中声明的具有自动存储持续时间的对象,首先执行重载决策以选择复制的构造函数,就像对象由rvalue指定一样

如果上面的句子意味着被解析为(copy elision criteria met && lvalue) …

c++ return language-lawyer compiler-bug move-semantics

18
推荐指数
1
解决办法
571
查看次数