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

彼得

我的课不好听。复制此文件将有问题。我想保证它永远不会被复制,所以我做了它的复制构造函数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;
     ^

但这是一个非常明显的情况,应使用复制省略,因此不应调用复制构造函数。为什么会这样呢?

杰斯珀·朱尔(Jesper Juhl)

直到C ++ 17复制省略是一种优化,编译器才不需要执行,因此类必须是可复制的,因为编译器可能要复制(即使实际上不是)。在C ++ 17中,在许多情况下都可以保证复制省略,然后类将不需要复制ctor。

也可以看看:

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到来之前适用于您的情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么auto关键字不能与函数指针的初始化列表一起使用?

来自分类Dev

为什么不能要求构造函数并立即将其与browserify一起使用?

来自分类Dev

为什么模拟不能与AsyncTask一起使用?

来自分类Dev

如何将std :: sort与没有复制构造函数的对象一起使用?

来自分类Dev

为什么此脚本不能与nohup一起使用,但是不能,不能呢?

来自分类Dev

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

来自分类Dev

LibreOffice为什么不能与HUD一起使用?

来自分类Dev

为什么使用函数声明不能与Web Worker一起使用?

来自分类Dev

为什么C#Rx Subscribe()函数不能与“ async”关键字一起使用?

来自分类Dev

为什么“均值”函数在函数环境中不能与“ group_by%>%summarise”一起正常使用?

来自分类Dev

为什么onmouseover()函数可与属性onmouseover =“ javascript代码”一起使用,但不能与addEventListener()函数一起使用?

来自分类Dev

为什么AND()条件/函数不能与ArrayFomula一起使用

来自分类Dev

为什么each()函数不能与连接到DOM的输入一起使用?

来自分类Dev

如何将复制构造函数与基类一起使用?

来自分类Dev

为什么我的sql与Max函数一起使用时,它不能与Abs函数一起工作?

来自分类Dev

LibreOffice为什么不能与HUD一起使用?

来自分类Dev

为什么childElementCount不能与jQuery一起使用?

来自分类Dev

为什么不能要求构造函数并立即将其与browserify一起使用?

来自分类Dev

为什么javascript“ this”不能与“ each”一起使用?

来自分类Dev

setuid为什么不能与mount一起使用?

来自分类Dev

为什么Quickbooks可以与Ubuntu一起使用,而不能与Fedora一起使用?

来自分类Dev

为什么此脚本不能与nohup一起使用,但是不能,不能呢?

来自分类Dev

为什么JQuery不能与CryptoJS一起使用?

来自分类Dev

为什么isblank返回的数组不能与Excel中的match函数一起使用?

来自分类Dev

为什么聚合函数不能与以下查询的内联视图一起使用?

来自分类Dev

为什么它可以与$ scope一起使用,但不能与`this`一起使用?

来自分类Dev

为什么 grep 不能与 iostat 一起使用?

来自分类Dev

为什么 foreach 不能与 String 一起使用?

来自分类Dev

为什么 ArrayFormula 不能与 LOOKUP 函数一起使用?

Related 相关文章

  1. 1

    为什么auto关键字不能与函数指针的初始化列表一起使用?

  2. 2

    为什么不能要求构造函数并立即将其与browserify一起使用?

  3. 3

    为什么模拟不能与AsyncTask一起使用?

  4. 4

    如何将std :: sort与没有复制构造函数的对象一起使用?

  5. 5

    为什么此脚本不能与nohup一起使用,但是不能,不能呢?

  6. 6

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

  7. 7

    LibreOffice为什么不能与HUD一起使用?

  8. 8

    为什么使用函数声明不能与Web Worker一起使用?

  9. 9

    为什么C#Rx Subscribe()函数不能与“ async”关键字一起使用?

  10. 10

    为什么“均值”函数在函数环境中不能与“ group_by%>%summarise”一起正常使用?

  11. 11

    为什么onmouseover()函数可与属性onmouseover =“ javascript代码”一起使用,但不能与addEventListener()函数一起使用?

  12. 12

    为什么AND()条件/函数不能与ArrayFomula一起使用

  13. 13

    为什么each()函数不能与连接到DOM的输入一起使用?

  14. 14

    如何将复制构造函数与基类一起使用?

  15. 15

    为什么我的sql与Max函数一起使用时,它不能与Abs函数一起工作?

  16. 16

    LibreOffice为什么不能与HUD一起使用?

  17. 17

    为什么childElementCount不能与jQuery一起使用?

  18. 18

    为什么不能要求构造函数并立即将其与browserify一起使用?

  19. 19

    为什么javascript“ this”不能与“ each”一起使用?

  20. 20

    setuid为什么不能与mount一起使用?

  21. 21

    为什么Quickbooks可以与Ubuntu一起使用,而不能与Fedora一起使用?

  22. 22

    为什么此脚本不能与nohup一起使用,但是不能,不能呢?

  23. 23

    为什么JQuery不能与CryptoJS一起使用?

  24. 24

    为什么isblank返回的数组不能与Excel中的match函数一起使用?

  25. 25

    为什么聚合函数不能与以下查询的内联视图一起使用?

  26. 26

    为什么它可以与$ scope一起使用,但不能与`this`一起使用?

  27. 27

    为什么 grep 不能与 iostat 一起使用?

  28. 28

    为什么 foreach 不能与 String 一起使用?

  29. 29

    为什么 ArrayFormula 不能与 LOOKUP 函数一起使用?

热门标签

归档