c++ - C++11 和 C++14 中的 constexpr(与 const 关键字没有区别)

标签 c++ c++11 c++14 constexpr

<分区>

在迈克·艾萨克森 (https://youtu.be/-ctgSbEfRxU?t=2907) 的“探索 C++17 及以后”演讲中,有一个关于写作的问题:

const constexpr ....

与单一常量。 Mike 说在 C++11 中 constexpr 意味着 const 而在 C++14 中则不是。 是真的吗? 我试图为此找到证明,但我找不到。

我不是在问 const 和 constexpr 之间的区别(以及许多其他问题),而是在询问两个版本的 C++ 标准中 constexpr 的区别。

最佳答案

考虑这段代码:

struct T { 
  int x;

  constexpr void set(int y) {
    x = y;
  }
};

constexpr T t = { 42 };

int main() {
  t.set(0);
  return 0;
}

它应该在 C++14 中编译,但在 C++11 中给出错误,就好像成员函数 set 被声明为 const。这是因为 constexpr 在 C++11 中隐含了 const,而在标准的后续版本中不再如此。

constexpr 关键字保证对象不会在运行时动态初始化。对于函数,它保证函数可以在编译时求值。在 C++11 中,这与“存储在只读内存中”相混淆,但这很快被识别为错误。

此外,在 C++14 中,constexpr 函数和成员的功能更加强大。例如,它们可以修改非 const 对象,因此它们不能隐式为 const

关于c++ - C++11 和 C++14 中的 constexpr(与 const 关键字没有区别),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42298214/

相关文章:

java - C++读取java进程输出

c++ - 增加 openMP 中的数组索引

c++ - C++ 标准是否要求在主线程中执行静态变量的动态初始化?

c++ - 无法从通用引用中捕获 lambda 中的引用?

c++ - 如何告诉 Borland C++ 枚举在类中?

c++ - 是否可以动态初始化静态成员数组

c++ - 如何在基类中获取派生类的子类型

c++ - 如何在 C++ 中整理树数据结构的前向引用

c++ - 为什么在优先级队列中使用容器参数进行重载?

c++ - 为什么 0 == ("abcde"+1) 不是常量表达式?