据我所知,inlineC++ 中的关键字可以追溯到旧编译器(当时称为“优化编译器”),它们无法像现代编译器那样进行优化,因此将函数标记为inline告诉编译器这应该是内联,并且作为副作用可以防止 ODR 问题。随着编译器变得更好,有人意识到编译器可以比程序员做得更好,因此inline编译器的要求更多地成为大多数(全部?)现代编译器忽略的“提示”。
输入C++11及后续版本。constexpr在我看来,至少在某些用途上,特别是函数和变量,情况类似。据我了解,它告诉编译器可以在编译时评估某个函数。但这是编译器应该能够自己解决的问题。一旦编译器在优化方面做得更好,这个功能是否也会成为一个“提示”?
注意:我不是询问 的其他用途constexpr,例如 withif语句。我明白这些是需要的。
\n\n据我了解,它告诉编译器可以在编译时评估某个函数。
\n
不是“可以”,而是“可以”。该constexpr关键字不会告诉编译器它可以做什么(它可以在编译时评估它想要的任何内容)。相反,关键字告诉编译器变量或函数所需的质量,特别是它可以在常量表达式中使用。如果程序未能满足该愿望,编译器将抱怨(错误或警告)。您会得到比否则更相关的错误消息 \xe2\x80\x93 编译器可以告诉您为什么您的实体不符合编译时评估的条件,因为它知道您的意图是让该实体成为编译时-时间常数。
例如,如果您定义了,如果在编译时未知的值,则const unsigned a使用它会出错。错误可能是在 的初始化中,或者可能是模板参数应该是而不是。编译器必须将错误报告为“不是常量表达式”,并让程序员进行调查。另一方面,如果声明了,编译器会抱怨编译时未知的值,从而减少调试时间。std::array<int, a>aabaaaconstexpra
没有constexpr,以下代码会产生可能较弱的错误消息。
{\n const unsigned a = foo();\n const unsigned b = 42;\n\n std::array<int, a> stuff; // Error: \'a\' is not a constant expression.\n // ...\n}\nRun Code Online (Sandbox Code Playgroud)\n将a和foo()声明为 后constexpr,错误消失。为什么?因为上周当您编写 时foo(),编译器被告知该函数必须可在常量表达式中使用。结果,编译器指出了为什么foo()无法在编译时求值,并且您立即修复了该错误。那是上周的事了,而foo()你对实施的情况还记忆犹新。本周不行,在做了十几件其他事情之后,包括与编译器争论的时间,因为你认为它a必须是一个常量表达式,因为它是用foo().
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |