C 11中的decltype和declval表示什麼意思,它們是如何使用的,會在什麼時候使用?

時間 2021-05-30 06:25:23

1樓:Lancern

假設我們希望實現乙個類似於 std::iterator_traits 的模板類,它接收乙個模板引數表示乙個迭代器的型別,並通過乙個成員型別別名 ValueType 輸出迭代器經解引用操作後得到的型別:

template

Iter

>class

MyIteratorTraits

;我們考慮應該如何實現 ValueType。我們可以通過 decltype 來推導乙個 *iter 這樣的表示式的型別,其中 iter 是模板引數型別 Iter 的例項。因此第一版實現:

template

Iter

>class

MyIteratorTraits

)>::

type;};

這裡,我們使用了 Iter 的構造器在 decltype 上下文中構造乙個 iter 物件。但這樣做有乙個問題:我們無法確保 Iter 有乙個無參構造器。

如果 Iter 沒有無參構造器,上面的實現將不能工作。

當需要在 unevaluated context (例如 decltype)中使用型別的例項時,一般都使用 std::declval 定義需要的例項物件,而不是顯式地呼叫構造器構造例項物件。因此上述的實現應改成:

template

Iter

>class

MyIteratorTraits

;其實 declval 的實現也非常簡單:

template

T>typename

std::

add_rvalue_reference

::

type

declval

()noexcept

;declval 沒有函式實現,只能用於 unevaluated context 等不需要 odr-use 的環境下。 declval 很好地解決了構造器引數無法確定的問題。

C 11中的auto和decltype的原理

已登出 auto使用的是模板實參推斷 Template Argument Deduction 的機制。auto被乙個虛構的模板型別引數T替代,然後進行推斷,即相當於把變數設為乙個函式引數,將其傳遞給模板並推斷為實參,auto相當於利用了其中進行的實參推斷,承擔了模板引數T的作用。比如 templat...

在C 11裡面,只用decltype而不用auto,為什麼是這樣的

一根筋的傻瓜 第二個部分的decltype出現在函式引數表之前,此時x,y還沒到達,所以這裡只能看到T,U這兩個模板引數,因為T,U是兩個型別,所以將0強制轉化為它們的指標,並取該指標的值,這樣就可以產生這兩個型別的產量相乘,就可以使用decltype了。 陸明非 decltype不會進行表示式運算...

怎樣理解C 11中的條件變數?

葉綠素 條件變數要和鎖一起使用,鎖提供了互斥這一機制,而條件變數在其基礎上提供了同步的機制 同步是比互斥更嚴格的關係,互斥只要求執行緒間訪問某一資源時不存在同時處理或者交替處理的可能,而對執行緒本身的排程順序沒有限制,也就是說誰先訪問都行但你們乙個個來,這就是互斥。同步就是在互斥的基礎上,雖然執行緒...