gpt4 book ai didi

c++ - 如何强制复制省略,为什么它不能与删除的复制构造函数一起使用?

转载 作者:太空宇宙 更新时间:2023-11-04 13:04:44 25 4
gpt4 key购买 nike

我有一个不可复制的类。复制这个会有问题。我想保证它永远不会被复制,所以我将它的复制构造函数删除:

class A {
public:
A();
A(const A&) = delete;
};

A fun() {
return A();
};

int main() {
A a = fun();
};

不幸的是,g++ 不会编译它的原因是:

t.cc: In function ‘A fun()’:
t.cc:8:12: error: use of deleted function ‘A::A(const A&)’
return A();
^
t.cc:4:5: note: declared here
A(const A&) = delete;
^
t.cc: In function ‘int main()’:
t.cc:12:13: error: use of deleted function ‘A::A(const A&)’
A a = fun();
^
t.cc:4:5: note: declared here
A(const A&) = delete;
^

但这是一个非常明确的情况,应该使用复制省略,所以永远不应该调用复制构造函数。为什么会这样?

最佳答案

在 C++17 之前,复制省略是编译器不需要执行的优化,因此类必须是可复制的,因为编译器可能想要复制(即使它实际上不需要)。在 C++17 中,在许多情况下将保证复制省略,然后类将不需要复制构造器。

另见:

http://en.cppreference.com/w/cpp/language/copy_elision

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html

https://herbsutter.com/2016/06/30/trip-report-summer-iso-c-standards-meeting-oulu/(关于“保证复制省略”的内容)

您也许可以使用在您的类中声明复制构造函数但不实际实现它的老把戏?只要编译器实际上不调用复制构造函数,那应该会让编译器满意。我没有对此进行测试,但我相信在 C++17 到来之前它应该适用于您的情况。

关于c++ - 如何强制复制省略,为什么它不能与删除的复制构造函数一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42926199/

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