指向字符串字面值的指针是否保证在std::string之前初始化?

5
//file1.cpp
extern const char* foo;
std::string bar = foo;

//file2.cpp
const char* foo = "foo";

这个标准是否保证bar被初始化为"foo"?或者它可能在foo设置之前被初始化,在构造函数中导致段错误,即SIOF的情况?

我认为这并不无关紧要,因为我之前看到过将字符串字面值转换为指针的规则存在一些古怪的问题(特别是与“constexpr”有关),所以这里也可能是一个特例。 - Artikash-Reinstate Monica
相关链接:https://dev59.com/donca4cB1Zd3GeqP7Cky(我仍然认为这里可能有重复问题)。 - Max Langhof
1个回答

8

常量初始化是保证最先发生的(在本例中是foo)。

所以

按照标准,bar会被初始化为“foo”吗?

是的。

还是说它可能在foo被设置之前被初始化并在构造函数中引起段错误,即SIOF的情况?

不会。

来源:https://en.cppreference.com/w/cpp/language/constant_initialization


这个答案和我的有什么不同?“如果在您的情况下两者都是全局的,那么std :: string bar将始终被初始化为“foo”,因为bar在编译器阶段依赖于foo”。 - Irelia
3
我担心这是错误的。请参考 https://dev59.com/donca4cB1Zd3GeqP7Cky 和 http://eel.is/c++draft/basic.start#static-3。 - Max Langhof
@Rakete1111 这里是否保证没有早期的动态初始化?我无法理解 http://eel.is/c++draft/basic.start#static-3.2... - Max Langhof
在实践中,这种情况并不会发生,因为编译器无法跨越翻译单元进行查看 :) - Rakete1111
@Rakete1111 嗯,链接时优化是一件事情,不是吗? - Max Langhof
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接