【发布时间】:2013-07-24 12:06:04
【问题描述】:
我正在通过面试问题寻找初级 C++ 开发人员职位。问题是(引用):
以下代码正确吗?
struct Foo
{
int i;
void foo ( void ) const
{
Foo* pointer = const_cast<Foo*>(this);
pointer->i = 0;
}
};
我会回答:
代码本身根据 C++03 和 c++11 标准是有效的,并且会成功编译。 但它可能会在赋值 pointer->i 期间调用未定义的行为 = 0; 如果调用 foo() 的类的实例被声明为 const。
我的意思是以下代码将成功编译并导致未定义的行为。
struct Foo
{
int i;
Foo ( void )
{
}
void foo ( void ) const
{
Foo* pointer = const_cast<Foo*>(this);
pointer->i = 0;
}
};
int main ( void )
{
Foo foo1;
foo1.foo(); // Ok
const Foo foo2;
foo2.foo(); // UB
return 0;
}
我的答案是正确的还是我遗漏了什么?谢谢。
【问题讨论】:
-
是的,没错。
-
“正确”是一个相当模糊的词。它是格式良好的,这意味着它没有可诊断的错误,但(如您所说)可能会导致未定义的行为。
-
来自设计 POV 的 IMO 它不是“正确的”,因为
const Foo foo; foo.foo();不应该是 UB。使用mutable成员会更好。 -
@MatsPetersson 我同意,这些是相关问题。我只是想确保我做的一切都是正确的。我应该删除问题吗?
-
鉴于您通过了第一个问题,接下来的问题是:举一个例子,说明
const_cast何时使用既安全又实用,这不是一个玩具示例。
标签: c++ c++11 constants undefined-behavior