如何解决为什么 move-only 对象不能添加显式关键字?
test.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
时,就可以了。
解决方法
通过使移动构造函数 explicit
你不能做
MacroObject x;
MacroObject y = std::move(x);
但可以做
MacroObject y(std::move(x));
即使在强制复制/移动省略 (NRVO) 生效的较新 C++ 版本中,函数的返回也会尝试匹配顶级版本。由于这不是匹配项,它会检查复制构造函数。由于那是 delete
d,它会因失败而停止。
它不会继续尝试 explicit
版本。他们不是候选人。
使复制和移动构造函数 explicit
使该类对许多标准库类/函数毫无用处,因此我建议不要使它们explicit
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。