首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >治安官的目的

治安官的目的
EN

Stack Overflow用户
提问于 2015-03-02 23:15:54
回答 1查看 1.1K关注 0票数 6

这更像是一个哲学问题,而不是实用的代码片段,但是也许C++专家可以启发我(如果已经有人问过了,也很抱歉)。

我一直在阅读迈尔斯的“有效的现代C++”一书中的第15项,以及这篇文章:implicit constexpr? (加上合理的谷歌搜索量)。该项讨论了表达式的constexpr用法,即它定义了可以返回给定编译时输入的编译时值的函数。此外,我提到的StackOverflow线程显示,一些编译器完全能够自己确定在编译时知道哪些函数调用结果。

因此,问题是:与定义编译器应该何时派生和允许静态/编译时值相比,为什么要将constexpr添加到标准中?

我意识到它使各种只编译的定义(例如std::array<T, constexpr>)更难以预测,但另一方面,正如Meyers的书中所指出的,constexpr是接口的一部分.如果删除它,可能会导致任意数量的客户端代码停止编译。因此,不仅有显式的constexpr要求人们记住添加它,它还为接口添加了永久的语义。

Clarification:这个问题并不是关于为什么要使用constexpr。我认识到,能够编程地派生编译时值是非常有用的,并在许多情况下自己使用了它。这是一个问题,为什么它是强制性的情况下,编译器可以推断自己的推断时间行为。

说明2:这里有一个代码片段,显示编译器不会自动推断出这一点,我在本例中使用了g++。

代码语言:javascript
复制
#include <array>

size_t test()
  {
  return 42;
  }

int main()
  {
  auto i = test();
  std::array<int, i> arrayTst;
  arrayTst[1] = 20;
  return arrayTst[1];
  }

std::array声明无法编译,因为我没有将test()定义为constexpr,这当然符合标准。如果标准是不同的,没有什么能阻止gcc独立地发现test()总是返回一个不变的表达式。

这个问题并不是问“标准定义了什么”,而是“为什么标准是这样的”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-02 23:20:07

constexpr之前,编译器有时可以计算出编译时间常数并使用它。然而,程序员不可能知道什么时候会发生这种情况。

之后,如果表达式不是编译时常量,程序员会立即被告知,并且他或她意识到需要修复它。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28821224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档