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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...