c – std :: move()在没有move-ctor的情况下调用copy-ctor.为什么以及如何预防呢?

前端之家收集整理的这篇文章主要介绍了c – std :: move()在没有move-ctor的情况下调用copy-ctor.为什么以及如何预防呢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道是否有一种安全的编程实践可以提醒编码人员在发生这种微妙的行为时,或者更好的是,首先要避免它.

struct A的用户可能没有意识到没有移动构造函数.在他们试图调用缺席的ctor时,他们既没有得到编译器警告,也没有得到复制ctor被调用的任何运行时指示.

下面的答案解释了发生的转换,但我认为这不是一个好事.如果缺少使用const引用作为参数的构造函数,则会出现编译时错误,而不仅仅是解析为非const引用版本.那么,为什么在类中没有实现移动语义时,尝试使用移动语义会导致编译时错误

有没有办法通过一些编译时选项来避免这种行为,或者至少是一种在运行时检测它的方法

如果他们在预料到这个问题,那么可以在移动之后断言(源是空的)但是对于这么多问题都是如此.

示例,时间:

struct A {
    A() {...}
    A(A &a) {...}
    A(A const & A) {...}
};

构造如下:

A a1;
A a2 = std::move(a1);  //calls const copy (but how would I know?)

这导致调用复制ctor的const版本.现在两个对象可能有一个指向单个资源的指针,而其中一个可能很快就会调用它的析构函数.

解决方法

因为std :: move返回一个rvalue,它可以转换为const ref,这就是为什么复制ctor被静默调用的原因.您可以通过多种方式解决此问题

>简单来说,如果你的类没有动态分配,只需使用这样的默认mctor.
A(A&&)=默认值;
>摆脱cctor中的const,不是一个好主意,但它不会编译
>只需实现自己的移动构造函数,如果没有mctor,为什么要移动到对象

这稍微偏离主题,但您也可以限定成员函数仅使用这样的可修改左值.

int func()&amp ;;

如果您正在处理遗留代码,则编译时检查move constructable

猜你在找的C&C++相关文章