我想知道是否有一种安全的编程实践可以提醒编码人员在发生这种微妙的行为时,或者更好的是,首先要避免它.
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版本.现在两个对象可能有一个指向单个资源的指针,而其中一个可能很快就会调用它的析构函数.