簡體   English   中英

{}在type_trait中的作用是什么 <T> {}在模板參數中使用?

[英]What is the role of the {} in type_trait<T>{} when used in a template parameter?

我經常在模板化代碼中看到這個{}出現。 我不確定我明白它在做什么。 例如:

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

什么是{}在這里? 它是否實例化了這種類型? 這意味着什么作為模板參數?

實例化類型的AFAIK意味着創建一個對象。 如何在此上下文中創建對象? 它只是創建一個虛擬對象? 為什么這樣? 這是什么意思和目的?

在此上下文中, 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的上下文中使用它,因此調用隱式轉換運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM