我有以下代码:
static constexpr const char*const myString = "myString";
请您解释一下有什么区别:
static const char*const myString = "myString";
在这种情况下,我们对constexpr有什么新内容?
答案 0 :(得分:7)
以下引用来自C ++标准(9.4.2静态数据成员)
中描述了不同之处3如果非易失性 const静态数据成员是整数或 枚举类型,它在类定义中的声明可以指定 一个大括号或者等于初始值的,其中每个初始化子句都是 assignmentexpression是一个常量表达式(5.19)。 静止 文字类型的数据成员可以在类定义中声明 使用constexpr说明符;如果是的话,其声明应指明一个 brace-or-equal-initializer ,其中每个初始化子句都是 赋值表达式是一个常量表达式。 [注意:两者都有 在这些情况下,成员可能出现在常量表达式中。 - 注意 如果成员仍然在命名空间范围内定义成员 程序中的odr-used(3.2)和命名空间范围定义应该 不包含初始化程序。
考虑例如两个程序
struct A
{
const static double x = 1.0;
};
int main()
{
return 0;
}
struct A
{
constexpr static double x = 1.0;
};
int main()
{
return 0;
}
第一个将无法编译,而第二个将编译。
同样适用于指针
这个程序
struct A
{
static constexpr const char * myString = "myString";
};
int main()
{
return 0;
}
将编译此porgram
struct A
{
static const char * const myString = "myString";
};
int main()
{
return 0;
}
不会编译。