隐式转换应该在模板参数的上下文中工作吗?

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)。

son*_*yao 5

您的代码格式良好,非类型模板参数应考虑转换的常量表达式

可以与非类型模板参数一起使用的模板参数可以是模板参数类型的任何转换常量表达式

转换常量表达式类型T是一个表达式 隐式转换到类型T,其中,所述转换后的表达式是一个常量表达式,并且隐式转换序列只包含:

  • constexpr 用户定义的转换(因此可以在需要整数类型的地方使用类)

std::is_pod继承自的转换运算符std::integral_constantconstexpr用户定义的转换,那么转换的bool自是std::is_pod转换后的常量表达式,可以应用。


作为解决方法(我想您已经意识到),您可以使用std::is_pod_v<T>(自 C++17 起)或std::is_pod_v<T>::value代替。