[英]How can A and not A be both true when using static_assert
涉及一些 constexpr 和类型特征的非常令人困惑的情况使我认为表达式的值是 true,而实际上它既是 true 又是 false。
https://godbolt.org/z/McYMvxasT
#include <utility>
#include <iostream>
template<typename T>
struct S {
constexpr int f() const {
constexpr bool t = std::is_same_v<double, double>;
static_assert(t);
static_assert(!t);
//static_assert(false);
return 0;
}
static const int t = f();
};
int main() {
//S<int> s;
//std::cout << S<int>::t;
return 0;
}
我知道如果 f() 永远不会被实例化,那么 static_asserts 会被跳过,但是这个假设被取消注释行static_assert(false)
拒绝了,这确实失败了。 这是编译器错误吗?
没有格式良好的实例化的模板是格式错误的,不需要诊断。 该程序无效,但不需要编译器对其进行诊断。
它不是既对又错:它根本没有被实例化,所以它没有被评估。 如果您取消注释 main 中的两个调用,它将触发错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.