Fed*_*dor 8 c++ language-lawyer constexpr c++-concepts c++20
我的一位同事向我展示了这个令人震惊的 C++20 程序:
#include <iostream>
constexpr int p(auto) { return 0; }
constexpr int q() { return p(0); }
constexpr int p(auto) requires true { return 1; }
static_assert(p(0) == 1);
static_assert(q() == 0);
int main()
{
std::cout << q() << p(0) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
由于错误,GCC 无法构建它:
Error: symbol `_Z1pIiEiT_' is already defined
Run Code Online (Sandbox Code Playgroud)
Clang 成功构建程序并打印11
(https://gcc.godbolt.org/z/1Gf5vj5oo)。所以static_assert(q() == 0)
被成功检查,但std::cout << q()
仍然打印1
. 怎么会这样?
Visual Studio 2019 16.10.4 的行为更加怪异。在 Release 配置中它也打印11
,在 Debug 配置中它也打印00
。在这两种情况下,函数的运行时值与其编译时值不同,由static_assert
.
我能想到的唯一解释是,所有这些都是编译器错误,并且constexpr
函数在编译和运行时必须始终产生相同的结果。那正确吗?
虽然这个程序是人为设计的,但它是有效的,并且按照您的想法执行(打印“01”),因此所有编译器都是错误的。GCC失败到裂伤的requires true
到第二名称p
,MSVC /调试是未能选择更多的约束的过载,而另外两种情况都没有使用所述查找结果从q
(其本身不是一个模板受到多个点实例化)。
至于问题标题,std::is_constant_evaluated
确实允许不断评估产生与运行时评估不同的结果。只为善使用这种力量!
归档时间: |
|
查看次数: |
170 次 |
最近记录: |