C++ 通过从';这';在构造函数中

C++ 通过从';这';在构造函数中,c++,this,constants,C++,This,Constants,示例代码: 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::i

示例代码:

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
是常量,但可以通过静态
实例
指针进行修改,该指针在
foo
的构造函数中被赋值为
this
。抛开为什么人们会想做这样的事情的问题不谈,我的理解是这里没有技术上不正确的东西

我相信这是安全的,但在线程中似乎有一些相反的建议。一个人似乎把一个类似的例子描述为不良行为,而另一个人则提到未定义的行为


撇开明智不谈,这在技术上是否正确和安全?还是我遗漏了什么问题?

这样做绝对是不明智的。原因很多

首先,它不是线程安全的


其次,通过
const\u cast
或您所展示的方法(或任何其他方法)来“取消”const限定对象,从而对其进行变异,这只是一种未定义的行为。

这样做绝对是不明智的。原因很多

首先,它不是线程安全的


其次,通过
const_cast
或通过您所展示的方法(或任何其他方法)来“取消”const限定对象,从而对其进行变异,这只是一种未定义的行为。

首先,它是UB。您不允许修改常量对象,无论您如何实现它。添加了说明,也不允许使用其他方法。如果我不清楚,请道歉,但问题不是关于线程安全(这是一个单独的主题)或可取性,而是关于技术上的正确性,或者说没有按照所示的方式改变一个常量对象。你确实回答了这个问题,我很感激。为了给将来的读者提供一个来源,答案似乎是有文档记录的。@scg在标准中请参见[dcl.type.cv]/4“除了任何声明为可变的类成员都可以修改外,任何在常量对象的生存期内修改常量对象的尝试都会导致未定义的行为。”(请注意,生命周期在构造函数完成后开始,因此允许在构造函数中赋值)首先,它是UB。不允许修改常量对象,无论您如何实现它。添加了说明,也不允许使用其他方法。如果我不清楚,请道歉,但问题不是关于线程安全的(这是一个单独的主题)或可取性,而是关于以所示方式对常量对象进行变异的技术正确性或不正确性。您确实提供了该问题的答案,我对此表示感谢。为了给将来的读者提供来源,答案似乎有文档记录。@scg在标准中请参见[dcl.type.cv]/4“除了任何声明为可变的类成员都可以修改外,任何试图在其生命周期内修改常量对象的行为都会导致未定义的行为。”(请注意,生命周期在构造函数完成后开始,因此允许在构造函数中赋值)