【发布时间】:2015-02-02 12:14:41
【问题描述】:
根据§7.1.5.1/4:
除了可以修改任何声明为 mutable (7.1.1) 的类成员外,任何在 const 对象的生命周期 (3.8) 期间修改它的尝试都会导致未定义的行为。
所以我的问题变成了:一个对象什么时候是一个 const 对象?
特别是,非 const 对象中的 const 成员是否被视为 const 对象?
class Foo {
const Bar bar;
void replaceBar(Bar bar2) {
*(const_cast<Bar *>&bar) = bar2; // Undefined behavior?
}
}
这是因为我有一个不可变的类(所有字段都是 const),但我想要一个移动构造函数,它在技术上修改传入的值。在这种情况下我可以接受“作弊”,因为它不会破坏逻辑常数。
【问题讨论】:
-
没错,确实是UB。
-
如果您要定义移动构造函数,那么您的成员之一可能是指针。在哪种情况下,使用指向 const 对象的可变指针而不是指向 const 对象的 const 指针是可以接受的?如果它不是指针或不可复制,那么移动构造函数不太可能有帮助。
-
@sjdowling 不一定。一个
std::string会很高兴离开。 -
我不同意“技术上”的分类。它确实修改了传入的值,并且它确实破坏了您所谓的“逻辑常量”。为什么编译器不应该假设在
Foo a; Foo b(move(a));中,a.bar没有被修改,如果你将它定义为const?如果a的任何析构函数被内联,如果在编译时知道构造函数的效果,那么这些析构函数中的条件可以很容易地被优化掉。
标签: c++ const-cast