如何强制复制省略,为什么它不适用于已删除的复制构造函数?

2024-01-05

我有一个不可复制的课程。复制这个会有问题。我想要保证它永远不会被复制,所以我制作了它的复制构造函数deleted:

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://en.cppreference.com/w/cpp/language/copy_elision

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html 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/ https://herbsutter.com/2016/06/30/trip-report-summer-iso-c-standards-meeting-oulu/(关于“保证复制省略”的部分)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何强制复制省略,为什么它不适用于已删除的复制构造函数? 的相关文章

随机推荐