为什么move-only对象不能添加显式关键字?

测试.cpp:

#include <iostream>

class MacroObject {
public :
    MacroObject() = default;

    MacroObject(const MacroObject&) = delete ;
    MacroObject& operator=(const MacroObject&) = delete;

    explicit MacroObject(MacroObject&&) = default;
    MacroObject& operator=(MacroObject&&) = default;

    int init(){return 0;}
    int get(){return 0;}
};

MacroObject getObj(){
    MacroObject obj;
    obj.init();
    return obj;
}

int main(){
    MacroObject obj{getObj()};
    std::cout << obj.get() << std::endl;
    return 0;
}

我在 g++ 4.8.5 中使用这个命令:

g++ -std=c++11 test.cpp

我收到此错误消息:

test.cpp: In function 'MacroObject getObj()':
test.cpp:19:8: error: use of deleted function 'MacroObject::MacroObject(const MacroObject&)'
 return obj;
        ^
test.cpp:6:1: error: declared here
 MacroObject(const MacroObject&) = delete ;
 ^

当我删除时explicit,就可以了。

为什么 g++ 使用删除的复制构造函数而不是移动构造函数?

回答

通过制作移动构造函数,explicit您无法做到

MacroObject x;
MacroObject y = std::move(x);

但可以做

MacroObject y(std::move(x));

即使在强制复制/移动省略 (NRVO) 生效的较新 C++ 版本中,函数的返回也会尝试匹配顶级版本。由于这不是匹配项,它会检查复制构造函数。由于那是deleted,它会因失败而停止。

它不会继续尝试explicit版本。他们不是候选人。

制作复制和移动构造函数explicit会使该类对许多标准库类/函数毫无用处,因此我建议不要制作它们explicit


以上是为什么move-only对象不能添加显式关键字?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>