根据标准规定:
5.13.5 字符串字面值 [lex.string]
16 评估字符串字面值,将生成一个具有静态存储持续时间的字符串字面量对象,根据指定的字符进行初始化。所有的字符串字面值是否不同(也就是说,存储在非重叠对象中)以及连续评估字符串字面值是否产生相同或不同的对象是未指定的。
以及:
6.6.4.1 静态存储周期 [basic.stc.static]
1 所有没有动态存储周期、没有线程存储周期且不是局部变量的变量都具有静态存储周期。这些实体的存储将持续整个程序的执行期间。
我认为可以安全地存储指向字符串字面值的指针,例如:
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")
{
}
};
以上的代码是否定义良好?有任何我需要注意的标准中的难点吗?
const char* x = "abcd"; const char* y = "abcd";
之后,x == y
将会是真的。 - Pete Becker