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

Arb*_*est 7 c++ move-semantics c++11

我想知道是否有一种安全的编程实践可以提醒编码人员在发生这种微妙的行为时,或者更好的是,首先要避免它.

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

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

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

如果他们在预料到这个问题,那么他们可以assert(source is null)在搬家之后,但这对许多问题都是如此.

示例,时间:

struct A {
    A() {...}
    A(A &a) {...}
    A(A const & A) {...}
};
Run Code Online (Sandbox Code Playgroud)

构造如下:

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

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

小智 1

因为 std::move 返回对右值的引用(如 A&& 中),该右值不可转换为对左值 (A&) 的引用,但可转换为对左值的 const 引用 (const A&)。

int x = 5。这里 5 是一个右值,永远不能绑定到左值,在您的示例中也是如此,因为您使用了 std::move(a1)