c++ - have - 'declare'が 'T &&'ではなく 'add_rvalue_reference<T>:: type'の観点から指定されているのはなぜですか?



conversion change (2)

いくつかの定義は、 declval依存し、 cv修飾された voidに対して妥当な結果を与え void 。 例はis_assignableです:

template <class T, class U>
struct is_assignable;

declval<T>() = declval<U>()は、評価されていないオペランドとして扱われるとうまく形成されます...

その意図は、「整形式」とは、代入式のdeclval<T>式であり、 declval<T>自体がdeclval<T>式であるかどうかではないということです。 つまり、一度に一つだけ心配したいのです。

https://src-bin.com

§20.2.4 [declval]

template <class T>
typename add_rvalue_reference<T>::type declval() noexcept; // as unevaluated operand

なぜここでadd_rvalue_reference使うのですか?

§20.9.7.2 [meta.trans.ref]から:

Tがオブジェクトまたは関数の型を指定する場合、メンバのtypedef typeT&& ; それ以外の場合は、 Tと命名します。 [ 注:この規則は参照崩壊(8.3.2)のセマンティクスを反映しています。 たとえば、型Tが型T1&場合、型add_rvalue_reference<T>::typeは右辺値参照ではありません。 -end note ]

add_rvalue_referenceは参照の折りたたみを反映するためのものなので、次のようにT&&使用するのはなぜですか?

template<class T>
T&& declval();

何がうまくいかないでしょうか? 2つのバージョンの違いは何ですか?


Answer #1

これが実際の理由であるかどうかはわかりませんが、 add_rvalue_referencevoid動作が異なりvoid

add_rvalue_reference<void>::typeは単にvoidです。

void&&はエラーです。





c++11