gpt4 book ai didi

c++ - 它在 C++11 标准中的什么地方指定了在翻译过程中何时可以评估 constexpr 函数?

转载 作者:IT老高 更新时间:2023-10-28 22:04:24 24 4
gpt4 key购买 nike

仅仅因为一个函数(或构造函数)......

  • 被声明为 constexpr 并且
  • 函数定义满足 constexpr 要求

...并不意味着编译器会在翻译过程中评估 constexpr 函数。我一直在查看 C++11 FDIS(N3242,可在 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/ 获得)试图确定两件事:

  • 编译器何时有义务在翻译期间评估 constexpr 函数?
  • 何时允许编译器在翻译期间评估 constexpr 函数?

第 5.19 节第 1 段说常量表达式可以在翻译过程中求值。据我所知,第 5.19 节的其余部分阐述了 constexpr 函数定义中的有效规则。

我知道我可以在翻译过程中通过将 constexpr 函数的结果声明为 constexpr 来强制进行 constexpr 评估。像这样:

// Declaration
constexpr double eulers_num() { return 2.718281828459045235360287471; }

// Forced evaluation during translation
constexpr double twoEulers = eulers_num() * 2.0;
static_assert(twoEulers > 5.0, "Yipes!");

到目前为止,我一直无法在 FDIS 中找到以下段落:

  • 强制 twoEulers 在翻译过程中被评估或
  • 指定编译器在翻译过程中可能或必须计算 constexpr 函数的其他情况。

我特别感兴趣的发现是翻译期间的 constexpr 评估是否由以下因素触发:

  1. 当传递给 constexpr 函数的所有参数都是字面量时,或
  2. 重载解析期间的隐含对象参数(第 13.3.1 节第 3 段)要么是 constexpr,要么需要字面量(例如对于数组维度),或者
  3. 完全不同的东西。

如果可能,请在您的回复中引用我可以查找的 FDIS 部分或我可以在 FDIS 中搜索的关键短语。标准中的英文有些迟钝,所以我可能一直在阅读相关段落,完全错过了它们的含义或意图。

最佳答案

“允许”在编译时评估 constexpr 调用,只要实际上可以这样做。请记住,规范在“好像”规则下运行。因此,如果您无法区分,编译器可以为所欲为。

编译器需要在编译时评估constexpr调用,而实际上需要在编译时得到答案。例如:

constexpr int foo() {return 5;}

std::array<float, foo()> arr;

编译器需要在编译时知道数组大小。因此,它必须在编译时计算常量表达式。如果 constexpr 函数无法在编译时执行,则会出现编译时错误。

关于c++ - 它在 C++11 标准中的什么地方指定了在翻译过程中何时可以评估 constexpr 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13571749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com