Nik*_*iou 19 c++ constexpr c++11
是constexpr编译器的指标还是强制执行行为?
手头的例子如下:
template<typename T>
std::size_t constexpr getID() { return typeid(T).hash_code(); }
Run Code Online (Sandbox Code Playgroud)
hash_code是一个运行时常量,但即使请求编译时评估,此片段也会编译constexpr.只有在期望编译时常量的返回值之后,才会注意到这不能用作constexpr函数.
那么是constexpr一个"提示"(很像inline关键字)或编译器的"绑定请求"?
R. *_*des 14
是
constexpr编译器的"提示"(如内联)还是"绑定请求"?
它既不是.忘记何时进行评估.volatile只要编译器认为有必要产生C++抽象机器的行为,就会评估所有内容(除少数例外,特别是涉及).关于何时评估事物,没有什么可说的.
编译器可以自由地生成代码,如果不产生不同的行为,则会在运行时评估什么是常量表达式.constexpr如果它具有智能,则可以自由地生成用于评估在编译时未标记的内容的代码.
如果不是关于编译时与运行时,那么是什么
constexpr呢?
constexpr允许将事物视为常量表达式.标记的任何内容都constexpr 必须以某种方式产生常量表达式.
在函数的情况下,它们可以用一些参数产生常量表达式而不能产生其他参数.但只要有一些参数可以导致常量表达式,就可以标记一个函数constexpr.如果在函数调用中使用了这样的参数集,则该表达式是常量表达式.这是否意味着它在编译时进行评估?往上看.它在编译器认为合适时进行评估.它唯一意味着你可以在需要常量表达的上下文中使用它.
对于变量,要么它们是常量表达式,要么不是.它们没有参数,所以如果constexpr它们总是必须用常量表达式初始化.
TL; DR:constexpr关于将事物标记为可用于常量表达式,而不是决定何时评估它们.
有了这个,看起来你的功能模板是不正确的.没有一组参数可以导致常量表达式.但是,该标准不需要对此进行诊断.
如果使用不是常量表达式的参数调用constexpr函数或构造函数,则调用的行为就好像函数不是constexpr,并且结果值不是常量表达式.同样,如果constexpr函数的return语句中的表达式未计算为特定调用的常量表达式,则结果不是常量表达式.
因此,constexpr说明符表示在编译时评估某些内容的可能性,并且在使用时受到一些限制.
对于您的特定代码片段,在我看来,C++ 11约束:
正好一个只包含文字值,constexpr变量和函数的 return语句
未满足,因为hash_code定义为:
size_t hash_code() const;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,标准草案n3242说:
对于constexpr函数,如果不存在函数参数值,使得函数调用替换将产生常量表达式(5.19),则程序格式错误; 无需诊断.
我相信你的榜样适合这里.
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |