【问题标题】:What is the role of the {} in type_trait<T>{} when used in a template parameter?type_trait<T>{} 中的 {} 在模板参数中的作用是什么?
【发布时间】:2018-09-22 05:53:46
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    在此上下文中,type_trait&lt;T&gt;{} 等效于 type_trait&lt;T&gt;::value。您的示例等效于以下内容:

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

    一般来说,使用type_trait&lt;T&gt;{} 而不是type_trait&lt;T&gt;::value 的一些好处是:

    • C++17 添加了type_trait_v&lt;T&gt;。在 C++17 之前,type_trait&lt;T&gt;{} 一样简洁。
    • type_trait&lt;T&gt;{} 与标签调度一起使用。也就是说foo(type_trait&lt;T&gt;{})可以根据type_trait&lt;T&gt;::value的值调用不同的重载,因为true和false值是不同的类型。

    这是有效的,因为类型特征继承自 std::integral_constant&lt;bool, Value&gt;constexpr operator bool() 返回值。因此,std::is_copy_constructible&lt;T&amp;&gt;{} 产生一个 std::is_copy_constructible&lt;T&amp;&gt; 类型的值,但由于我们在需要 bool 的上下文中使用它,因此调用了隐式转换运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 2021-10-29
      • 2017-03-09
      相关资源
      最近更新 更多