我经常在模板代码中看到此{}
的出现。我不确定自己在做什么。例如:
std::enable_if_t<std::is_copy_constructible<T&>{} && !std::is_same<T, MyClass>{}>>
这里的{}
是什么?实例化类型吗?作为模板参数是什么意思?
AFAIK实例化类型意味着创建一个对象。在这种情况下如何创建对象?它只是创建一个虚拟对象吗?那为什么呢?这是什么意思和目的?
答案 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
的一些好处是:
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
的上下文中使用它,因此调用了隐式转换运算符。