用const char * const解释constexpr

时间:2015-04-24 09:40:37

标签: c++ c++11 const constexpr

我有以下代码:

static constexpr const char*const myString = "myString";

请您解释一下有什么区别:

static const char*const myString = "myString";

在这种情况下,我们对constexpr有什么新内容?

1 个答案:

答案 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;
}

不会编译。