【发布时间】:2020-03-24 12:51:56
【问题描述】:
编译器是否保证在 constexpr 环境中计算 "tautologies" 的布尔 constexpr 表达式(例如始终分别为 true 或 false)?
最小示例/说明
例如,在下面的代码片段中(在标有(1) 的行处)我在constexpr 环境中调用了一个函数,我打算在传递non-constexpr 函数时导致编译时错误。至少我使用的编译器 (g++-10.0) 可以做到这一点,即使它也可以意识到表达式始终为 true 而无需对其进行评估。我问这个问题的原因是因为——据我所知——在非 constepxr 上下文中,像 i >= std::numeric_limits<int>::min() 这样的表达式被优化为 true 的 int i 。
#include <limits>
constexpr int example_function() { return 1;}
constexpr bool compileTimeErrorDesired = example_function() || true; // (1)
应用示例
如果(1) 中的行为得到保证,它可以例如在concept 中使用,以执行不同的代码,具体取决于作为模板参数提供的函数是否可以在编译时进行评估。我实现了一个非常短的 (7 lines-of-code) 示例,它完全符合 here at compiler explorer。
问题
如果使用非 constexpr 函数调用第 (1) 行,是否保证会导致编译时错误?
编辑插入说明,根据反馈简化示例。
【问题讨论】:
-
你的意思是
example_function不是constexpr?如果example_function不是constexpr,则example_function() || true不是常量表达式,编译器需要诊断出static_assert的非常量表达式。 -
您所说的“具有更明显的重言式,不会引发编译时错误”是什么意思?如果
example_function没有声明为constexpr,那么g++ 会正确拒绝static_assert(example_function() || true)。 -
保证什么行为?我完全不明白这个问题在问什么。
-
保证。根据 C++ 规则,
example_function() || true不是常量表达式,即使它的值在数学上是常量。 -
IMO 问题实际上是指“AS IF 规则”,这很好explained here。 order of evaluating operator arguments 也对这个问题有影响。
标签: c++ language-lawyer constexpr c++20 c++-concepts