gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:22:22 25 4
gpt4 key购买 nike

测试.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++ 使用删除的复制构造函数而不是移动构造函数?

最佳答案

通过使移动构造函数显式你不能这样做

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

但可以做

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

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

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

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

关于c++ - 为什么只移动对象不能添加显式关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67866098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com