gpt4 book ai didi

c++ - 在函数静态变量上调用 setter 一次

转载 作者:行者123 更新时间:2023-11-30 05:06:59 34 4
gpt4 key购买 nike

我正在使用一个函数静态变量,我想通过调用 setter 来初始化一次:

void foo() {
static Obj obj;
obj.setName("name"); // this should be called once
// use obj
}

我不希望 setter 被多次调用,这也是由于多线程问题,而且我无法向 Obj 添加构造函数,因为我不拥有代码。那么这是否合理且线程安全:

void foo() {
static Obj obj = []() {
Obj o;
o.setName("name");
return o;
}();
// use obj
}

最佳答案

是的,它是线程安全的。引用 n3337 - [stmt.dcl]/4 ,强调我的:

...such a variable is initialized the first time control passes through its declaration; such a variable is considered initialized upon the completion of its initialization. If the initialization exits by throwing an exception, the initialization is not complete, so it will be tried again the next time control enters the declaration. If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.

您从 lambda 的返回值执行复制初始化,但这无关紧要。上面的段落并没有将obj的初始化限制为值或直接初始化。所有形式的初始化都适用。

附带说明一下,如果您必须应对此类编写不当的类型,我认为您的解决方案非常地道。它不会人为地引入一个新的命名函数来执行初始化。相反,它使初始化代码保持本地化。在我看来,这是一件好事。

关于c++ - 在函数静态变量上调用 setter 一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47696509/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com