其他分享
首页 > 其他分享> > c – 如何强制执行复制省略,为什么它不适用于已删除的复制构造函数?

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

作者:互联网

我有一个无法上课的课程.复制这将是有问题的.我想保证它不会被复制,所以我删除了它的复制构造函数:

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/
(关于“保证副本省略”的一点)

你也许可以使用在你的类中声明复制构造函数的旧技巧,但实际上并没有实现它?只要它不实际调用复制ctor,这应该取悦编译器.我没有测试过,但我相信它应该适用于你的情况,直到C 17到来.

标签:copy-elision,c,c11
来源: https://codeday.me/bug/20190926/1818835.html