这是一个语言律师问题,而不是一个好的练习题。
以下代码是有效还是未定义的行为? const对象最终调用非const函数,但实际上并不修改对象的状态。
struct Bob
{
Bob() : a(0) {}
int& GetA()
{
return a;
}
const int& GetA() const
{
return const_cast<Bob&>(*this).GetA();
}
int a;
};
int main()
{
const Bob b;
int a = b.GetA();
}
答案 0 :(得分:8)
行为定义明确:
C ++标准,第5.2.11 / 7节[const cast]
[注意:根据对象的类型,写入操作通过指针,左值或指针到数据成员由const_cast转换为const -qualifier可能会产生未定义的行为。 - 后注]
GetA()
不会写Bob
的任何成员,因此该程序不涉及未定义的行为。
答案 1 :(得分:4)
我认为它定义明确,因为标准仅将未定义的行为归因于修改 const
对象。 C ++ 11引用如下:
[expr.const.cast]5.2.11§7
[注意:取决于对象的类型,通过指针,左值或指针进行写操作 从
const_cast
生成的数据成员转出const限定符可能会产生未定义的 行为(7.1.6.1)。 -end note ]
[dcl.type.cv]7.1.6.1§4
除了可以修改声明
mutable
(7.1.1)的任何类成员之外,任何修改const
的尝试都是如此 对象在其生命周期(3.8)中导致未定义的行为。 ...
GetA()
实际上并不修改任何对象,因此它没有未定义的行为。