示例代码。
struct Foo {
Foo() { instance = this; }
int value = 0;
static Foo * instance;
};
Foo * Foo::instance = nullptr;
int main(int argc, char * argv[]) {
Foo const foo;
//foo.value = 1; // Compiler error, as expected.
Foo::instance->value = 1; // Fine.
}
这里 foo
是常数,但可以通过静态的 instance
指针,该指针的值为 this
在 Foo
的构造函数。抛开为什么要这样做的问题不谈,我的理解是,这里没有什么技术上的错误。
我相信这样做是安全的,但在 这个 线程中,似乎有一些相反的建议。有一个人似乎将类似的例子描述为不正规,而另一个人则提到了未定义的行为。
撇开建议不谈,这在技术上是否正确和安全?还是我遗漏了什么问题?
这样做是绝对不明智的。原因有很多。
首先,这不是线程安全的。
第二,通过 "解除consting "来突变const限定的对象。const_cast
或通过你所展示的方法(或任何其他方法),就是简单的。未定义的行为.