当前位置: 首页 > 知识库问答 >
问题:

用const char*const[duplicate]解释constexpr

洪知
2023-03-14

我有以下代码:

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

你能解释一下和以下有什么区别吗?

static const char*const myString = "myString";

在这种情况下,我们有什么新发现?

共有1个答案

唐康安
2023-03-14

以下引用C标准(9.4.2静态数据成员)对差异进行了描述

3如果一个非易失性const静态数据成员是整型或枚举型的,它在类定义中的声明可以指定一个大括号或等号初始化器,其中每一个初始化器子句都是一个常量表达式(5.19)。文本类型的静态数据成员可以在类定义中声明,如果是这样,它的声明应该指定一个大括号或相等初始化器,其中作为赋值表达式的每个初始化子句都是一个常量表达式。[注意:在这两种情况下,成员可能出现在常量表达式中。-结束注意]如果成员在程序中使用odr(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;
}

不会编译。

 类似资料:
  • 有时意味着 在这种情况下,由于运行时速度的提高,用户是否应该总是选择而不是?

  • 以下代码无法在Ideone上实时编译: 错误消息为: 用替换的声明,它将成功编译。 另一方面,当使用而不是时,似乎与配合得很好: 为什么和在用初始化时会得到不同的处理? 这是Ideone编译器中的错误吗?这是C++标准所要求的吗?为什么? 上面的代码是UB吗? 附注。我尝试使用Visual Studio2015 C++编译器,它很好地编译了第一个代码段(用初始化)。

  • 本文向大家介绍C++中的const和constexpr详解,包括了C++中的const和constexpr详解的使用技巧和注意事项,需要的朋友参考一下 C++中的const可用于修饰变量、函数,且在不同的地方有着不同的含义,现总结如下。 const的语义 C++中的const的目的是通过编译器来保证对象的常量性,强制编译器将所有可能违背const对象的常量性的操作都视为error。 对象的常量性可

  • null > (Docs) +javax包因此看起来是未来的证明 -是JEE的一部分,而不是JSE的一部分。在JSE中,需要导入其他库。 -静态分析工具不支持(仅运行时验证) (docs) -外部库,而不是包 -自findbugs版本3.x以来已不推荐使用 +用于静态分析(由findbugs和Sonar使用) (docs) +用于静态分析(在findbugs中) -JSR-305在fb邮件列表中显

  • 问题内容: 此语法在JavaScript中可能意味着什么(可能是ES6): const {} =变量名; 我目前正在尝试掌握React。在很多示例中,我都遇到了这种语法。例如: 问题答案: 首先,这与React无关。它是ECMAScript 6(如果您愿意的话,也可以是JavaScript 2015)的一部分。 您在此处看到的称为“ 分解任务”: 在学习React时,您可能会遇到类似的情况: 在这

  • 问题内容: 我偶然发现了将DOM NodeList转换为常规数组的简洁捷径,但我必须承认,我并不完全了解它的工作原理: 因此,它以一个空数组开头,然后用于将结果转换为新数组,是吗? 我不明白的是。它如何从NodeList转换为常规数组? 问题答案: 这里发生的是,您调用它就像是使用的功能。在这种情况下,要做的是创建一个空数组,然后遍历其运行的对象(最初是一个数组,现在是一个数组),并将该对象的元素