Mir*_*pas 5 c++ static object-lifetime
根据标准:
5.13.5 字符串文字 [lex.string]
16 评估字符串文字会产生具有静态存储持续时间的字符串文字对象,该对象根据上面指定的给定字符进行初始化。未指定所有字符串文字是否不同(即存储在不重叠的对象中)以及字符串文字的连续计算是否产生相同或不同的对象。
和:
6.6.4.1 静态存储持续时间[basic.stc.static]
1 所有没有动态存储持续时间、没有线程存储持续时间、并且不是本地的变量都具有静态存储持续时间。这些实体的存储应在程序持续期间持续
我认为存储指向字符串文字的指针是安全的,例如:
struct Base
{
Base(const char* name)
: _name(name)
{
}
void print()
{
std::cout<<_name<<std::endl;
}
const char* _name = nullptr;
};
struct MyDerived : public Base
{
MyDerived () : Base("MyDerived")
{
}
};
Run Code Online (Sandbox Code Playgroud)
上面的代码定义清楚了吗?标准中有哪些我必须注意的阴暗角落吗?
上面的代码定义清楚了吗?
是的。
标准中有哪些我必须注意的阴暗角落吗?
也许不是标准中的黑暗角落,但一个问题是你有一个指针,并且允许Base
像这样实例化和使用:
Base foo(nullptr);
foo.print();
Run Code Online (Sandbox Code Playgroud)
来自operator<<
:“如果是空指针,则行为未定义s
。 ”
一个更安全的构造函数:
template<size_t N>
constexpr Base(const char(&name)[N]) : _name(name) {}
Run Code Online (Sandbox Code Playgroud)
我说一些是因为你仍然可以这样做:
auto Foo() {
const char scoped[] = "Fragile";
Base foo(scoped);
foo.print(); // OK
return foo;
} // "scoped" goes out of scope, "_name" is now dangling
int main() {
auto f = Foo();
f.print(); // UB
}
Run Code Online (Sandbox Code Playgroud)