C++ 为什么只移动对象不能添加显式关键字?

C++ 为什么只移动对象不能添加显式关键字?,c++,c++11,C++,C++11,test.cpp: #包括 类宏对象{ 公众: 宏对象()=默认值; 宏对象(常量宏对象&)=删除; 宏对象和运算符=(常量宏对象-)=删除; 显式宏对象(宏对象&&)=默认值; 宏对象和运算符=(宏对象&&)=默认值; int init(){return 0;} int get(){return 0;} }; 宏对象getObj(){ 宏对象对象; obj.init(); 返回obj; } int main(){ 宏对象obj{getObj()}; std::cout通过使move构造函数显式

test.cpp:

#包括
类宏对象{
公众:
宏对象()=默认值;
宏对象(常量宏对象&)=删除;
宏对象和运算符=(常量宏对象-)=删除;
显式宏对象(宏对象&&)=默认值;
宏对象和运算符=(宏对象&&)=默认值;
int init(){return 0;}
int get(){return 0;}
};
宏对象getObj(){
宏对象对象;
obj.init();
返回obj;
}
int main(){
宏对象obj{getObj()};

std::cout通过使move构造函数显式
您无法执行

MacroObject x;
MacroObject y = std::move(x);
但我能做到

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

从函数返回,即使在强制拷贝/移动删除(NRVO)生效的新C++版本中,尝试匹配顶部版本。因为这不是匹配,它检查复制构造函数。因为这是<代码>删除< /代码> d,它以失败停止。

它不会继续尝试显式版本。它们不是候选版本


使复制和移动构造函数
显式
会使该类对许多标准库类/函数无效,因此我建议不要使它们
显式

注意,OP使用c++11,因此没有强制的复制省略。@IgorR.True,我更新了它。此外,复制省略是一种语言功能(不需要复制),而NRVO仅仅是一种优化(必须定义复制ctor,但可能未使用)。