【发布时间】:2021-10-02 08:45:09
【问题描述】:
在以下示例中,第二个 f 函数重载的 requires 表达式具有 std::integral_constant<bool,true> 类型,可隐式转换为 bool:
#include <type_traits>
struct S {
static constexpr bool valid = true;
};
template<typename T>
int f() { return 1; }
template<typename T>
int f() requires( std::bool_constant< T::valid >() ) { return 2; }
int main() {
return f<S>();
}
可以观察到 GCC 拒绝了程序,因为类型不完全是 bool,但 Clang 接受,但选择了另一个重载 int f() { return 1; }。演示:https://gcc.godbolt.org/z/nf65zrxoK
这里哪个编译器是正确的?
【问题讨论】:
-
我没有找到任何可以将任何表达式隐式转换为布尔值的东西。因此,gcc 对我来说看起来不错。要获得到 bool 的显式转换,您必须编写:
std::bool_constant< T::valid >::value或执行像(bool)std::bool_constant< T::valid >这样的显式转换。如果你想调用执行操作符,你必须在之前创建一个对象:std::bool_constant< T::valid >{}()。您忘记创建对象只是代码中的一个错字吗?
标签: c++ language-lawyer c++20 c++-concepts