[英]Is the following use of const_cast undefined behavior?
这是一个语言律师问题,而不是一个好的练习题。
以下代码是有效还是未定义的行为? 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();
}
行为定义明确:
C ++标准,第5.2.11 / 7节[const cast]
[注意:根据对象的类型,通过指针,左值或指向数据成员的指针的写入操作会导致const-qualifier的const_cast,这可能会产生未定义的行为。 - 尾注]
GetA()
不会写任何Bob
成员,因此该程序不涉及未定义的行为。
我相信它是定义明确的,因为标准仅归因于修改 const
对象的未定义行为。 C ++ 11引用如下:
[expr.const.cast]5.2.11§7
[ 注意:根据对象的类型,通过指针,左值或指向数据成员的指针的写入操作会导致const-qualifier的
const_cast
产生未定义的行为(7.1.6.1)。 - 尾注 ]
[dcl.type.cv]7.1.6.1§4
除了可以修改声明为
mutable
(7.1.1)的任何类成员之外,任何在其生命周期内修改const
对象的尝试(3.8)都会导致未定义的行为。 ...
GetA()
实际上并没有修改任何对象,因此它没有未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.