§20.2.4 [declval]
Tại sao 'declval' được chỉ định theo 'add_rvalue_reference <T> :: type' và không phải 'T &&'?
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept; // as unevaluated operand
Tại sao sử dụng add_rvalue_reference
đây?
Từ §20.9.7.2 [meta.trans.ref]
trên add_rvalue_reference
:
Nếu
T
tên một đối tượng hoặc chức năng loại sau đó các thành viên typedeftype
sẽ đặt tênT&&
; nếu không,type
sẽ có tênT
. [Lưu ý: Quy tắc này phản ánh ngữ nghĩa của việc thu gọn tham chiếu (8.3.2). Ví dụ: khi một loạiT
tên là loạiT1&
, loạiadd_rvalue_reference<T>::type
không phải là tham chiếu rvalue. -end lưu ý]
Kể từ add_rvalue_reference
là có nghĩa là để phản ánh tham khảo sụp đổ dù sao, tại sao không chỉ cần sử dụng T&&
như sau?
template<class T>
T&& declval();
Điều gì có thể xảy ra? Sự khác biệt chính xác giữa hai phiên bản là gì?
"Điều gì có thể xảy ra sai?" Con vịt! –
@LightnessRacesinOrbit: Err .. cái gì? Chỉ vì tôi bỏ qua một cái gì đó tôi nhận được -1? Thú vị ... – Xeo
@Lightness Now _that_ là vô nghĩa. –