在模板参数中使用时,{}在type_trait <t> {}中的作用是什么?

时间:2018-09-22 05:53:47

标签: c++ templates types template-meta-programming typetraits

我经常在模板代码中看到此{}的出现。我不确定自己在做什么。例如:

std::enable_if_t<std::is_copy_constructible<T&>{} && !std::is_same<T, MyClass>{}>>

这里的{}是什么?实例化类型吗?作为模板参数是什么意思?

AFAIK实例化类型意味着创建一个对象。在这种情况下如何创建对象?它只是创建一个虚拟对象吗?那为什么呢?这是什么意思和目的?

1 个答案:

答案 0 :(得分:8)

在这种情况下,type_trait<T>{}等效于type_trait<T>::value。您的示例等效于以下内容:

std::enable_if_t<std::is_copy_constructible<T&>::value && !std::is_same<T, MyClass>::value>>

通常,使用type_trait<T>{}代替type_trait<T>::value的一些好处是:

  • C ++ 17添加了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&>的值,但是由于我们在期望bool的上下文中使用它,因此调用了隐式转换运算符。