給定類型A,B
,我關心的是std::common_type<A,B>
的確切定義,忽略任意類型A...
的可變參數std::common_type<A...>
。因此,讓應該std :: common_type使用std :: decay?
using T = decltype(true ? std::declval<A>() : std::declval<B>());
using C = std::common_type<A,B>;
現在,據一些來源,我發現下面的關係(爲簡便起見跳過typename
):
cppreference.com:
C::type = std::decay<T>::type
cplusplus.com:
C::type = T
GCC 4.8.1
<type_traits>
implementationatio N:C::type = std::decay<T>::type
如果T
是有效的,否則C
不包含::type
成員( 「SFINAE友好」)鏘3.3
<type_traits>
實現:C::type = std::remove_reference<T>::type
我找到 「SFINAE友好」 版本的海灣合作委員會的一個小細節,而std::remove_reference
和std::decay
實際上只有不同的內置陣列和功能,再加上cv資格,對此我不再關心。所以我的問題是
它應該是decay<T>::type
或只是T
?使用decay<T>::type
的基本原理是什麼?是否只是代表結果A() + B()
爲算術表達式?
例如,嘗試了一下,我發現,在「公正T
」的定義的情況下,我們有
common_type<int&,int&> = int&
common_type<int&,long&> = long
就是左值參考保持如果類型相同 。這反映了一個事實,即
int a, b;
(true ? a : b) = 0;
是有效的,而
int a;
long b;
(true ? a : b) = 0;
不是。 「允許賦值如果類型相同」這種語義正是我在一個應用程序中需要的,我傾向於認爲common_type
和decay
應該是兩個獨立的步驟。我應該只使用我自己的定義嗎?
'remove_reference'和'decay'也不同在CV-資格引用類型; 'std :: declval '返回一個右值引用。 – dyp
'T'舊(C++ 11),'decay'是新的(C++ 1y),可能存在與此相關的缺陷。讓我看看.. –
dyp
@dyp是的,我並不那麼小心,這就是爲什麼我寫了「幾乎」,我會修復。 – iavr