Nik*_*kos 7 c++ templates types type-traits template-meta-programming
我经常{}在模板化的代码中看到这种情况.我不确定我明白它在做什么.例如:
std::enable_if_t<std::is_copy_constructible<T&>{} && !std::is_same<T, MyClass>{}>>
Run Code Online (Sandbox Code Playgroud)
这是什么{}?它是否实例化了这种类型?这意味着什么作为模板参数?
实例化类型的AFAIK意味着创建一个对象.如何在此上下文中创建对象?它只是创建一个虚拟对象?为什么这样?这是什么意思和目的?
在这种背景下,type_trait<T>{}相当于type_trait<T>::value.您的示例等效于以下内容:
std::enable_if_t<std::is_copy_constructible<T&>::value && !std::is_same<T, MyClass>::value>>
Run Code Online (Sandbox Code Playgroud)
一般来说,使用type_trait<T>{}而不是使用的一些好处type_trait<T>::value是:
type_trait_v<T>.在C++ 17之前,type_trait<T>{}就像简洁一样.type_trait<T>{}适用于标签调度.也就是说,foo(type_trait<T>{})可以根据值调用不同的重载,type_trait<T>::value因为true和false值是不同的类型.这是有效的,因为类型特征从中继承std::integral_constant<bool, Value>有constexpr operator bool()返回值的类型.因此,std::is_copy_constructible<T&>{}生成一个类型的值std::is_copy_constructible<T&>,但由于我们在期望a的上下文中使用它bool,因此调用隐式转换运算符.