Yon*_* Wu 3 c++ templates language-lawyer implicit-conversion non-type
更明确地说,编译器是否应该将true_type
值视为true
的第一个参数enable_if
,因为true_type
是真的std::integral_constant<bool, true>
,并integral_constant
定义了类型转换函数operator value_type
?
下面是最简单的测试代码:
#include <type_traits>
template <typename T>
std::enable_if_t<std::is_pod<T>{}>
test(T)
{
}
int main()
{
test(true);
}
Run Code Online (Sandbox Code Playgroud)
它被 GCC 和 Clang 接受,但被 MSVC 拒绝(直到 Visual Studio 2019 v16.3.1)。
可以与非类型模板参数一起使用的模板参数可以是模板参数类型的任何转换常量表达式。
甲转换常量表达式类型
T
是一个表达式 隐式转换到类型T
,其中,所述转换后的表达式是一个常量表达式,并且隐式转换序列只包含:
constexpr
用户定义的转换(因此可以在需要整数类型的地方使用类)
std::is_pod
继承自的转换运算符std::integral_constant
是constexpr
用户定义的转换,那么转换的bool
自是std::is_pod
转换后的常量表达式,可以应用。
作为解决方法(我想您已经意识到),您可以使用std::is_pod_v<T>
(自 C++17 起)或std::is_pod_v<T>::value
代替。
归档时间: |
|
查看次数: |
121 次 |
最近记录: |