【发布时间】:2013-08-18 07:41:05
【问题描述】:
我想知道是否有一种安全编程实践可以提醒编码人员注意这种微妙的行为,或者更好的是,首先避免它。
struct A 的用户可能没有意识到没有移动构造函数。在他们尝试调用不存在的 ctor 时,他们既没有收到编译器警告,也没有收到任何运行时指示,而是调用了复制 ctor。
下面的答案解释了发生的转换,但我不认为这是一件好事。如果缺少将 const 引用 作为参数的构造函数,则会出现编译时错误,而不仅仅是解析为 non-const 引用 版本。那么,当类中没有实现移动语义时,为什么尝试使用移动语义不会导致编译时错误?
有没有办法通过一些编译时选项来避免这种行为,或者至少有一种方法可以在运行时检测到它?
搬家后如果他们可以assert(source is null),他们已经预料到了这个问题,但很多问题都是如此。
例如,当:
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 版本。现在两个对象可能有一个指向单个资源的指针,而其中一个可能很快就会调用它的析构函数。
【问题讨论】:
-
“现在两个对象可能有一个指向单个资源的指针,而其中一个可能很快就会调用它的析构函数。”那么这是你程序中的一个错误。修复它。
-
如果你的类设计得好,就创建一个默认的。
A(A &&) = default -
@Arbalest:你的整个问题都是基于复制而不是移动是一个错误。您可以通过复制您的课程并对其进行测试并遵守三规则来检测它。搬家与此无关。
-
@Arbalest 我想简短的回答是你不能。其他评论者遇到的问题是为什么您认为这是一个问题。这就是结构 A 的设计方式。意思是“我可以被复制,但不能被感动”。
-
只要把移动想象成复制的优化。当编译器跳过其他优化时,您不会收到警告;你为什么会在这里期待一个?
标签: c++ c++11 move-semantics