“轉發參考”用引號引起來,因為const-qualified 轉發參考實際上并不是轉發參考,但我想明確表示我特指的是函式模板。
采取以下測驗功能(代碼重復以避免:
#include <iostream>
#include <type_traits>
#include <typeinfo>
using namespace std;
template <typename T, typename U> void print_types() {
cout << (is_const_v<remove_reference_t<T>> ? "const " : "")
<< typeid(T).name()
<< (is_rvalue_reference_v<T> ? " &&"
: is_lvalue_reference_v<T> ? " &"
: "")
<< ", " << (is_const_v<remove_reference_t<U>> ? "const " : "")
<< typeid(U).name()
<< (is_rvalue_reference_v<U> ? " &&"
: is_lvalue_reference_v<U> ? " &"
: "")
<< endl;
}
template <typename T> void print_rvalue_reference(T &&t) {
print_types<T, decltype(t)>();
}
template <typename T> void print_const_rvalue_reference(const T &&t) {
print_types<T, decltype(t)>();
}
int main() {
int i = 1;
const int j = 1;
print_rvalue_reference(1); // int, int &&
print_rvalue_reference(i); // int &, int &
print_rvalue_reference(j); // const int &, const int &
print_const_rvalue_reference(1); // int, const int &&
print_const_rvalue_reference(i); // error
print_const_rvalue_reference(j); // error
}
首先,我想請注意,print_rvalue_reference(j)只有作品,因為print_rvalue_reference從來沒有使用t在非const背景關系。如果不是這種情況,模板實體化將失敗。
我很困惑為什么最后兩個呼叫在main編譯程序中會導致錯誤。參考折疊允許using T = int &; const T &&成為int &和using T = const int &; const T &&成為const int &,這意味著print_const_rvalue_reference<int &>(i)和print_const_rvalue_reference<const int &>(j)是有效的。
為什么print_const_rvalue_reference(j)演繹噸至被int代替的const int &時候print_rvalue_reference(j) 確實演繹噸至是const int &?(真實的)轉發參考是否特殊情況下產生int &而不是int作為其扣除指南的一部分?
uj5u.com熱心網友回復:
實際的轉發參考確實是特殊情況以推匯出參考型別。見[temp.deduct.call]/3:
如果
P是 cv 限定型別,P則忽略 's 型別的頂級 cv 限定符進行型別推導。如果P是參考型別,則參考的型別P用于型別推導。...如果P是轉發參考并且引數是左值,則使用“左值參考到A”A型別代替型別推導。
因此,在 where Pis const T&&(不是轉發參考)的情況下,它被轉換為const T并且引數是否為左值不會影響型別推導,因為值類別不是引數型別的一部分。取而代之的是,扣程序簡單地嘗試查找T,使得const T相同型別作為引數(可能具有附加的CV-資質)。在iand的情況下j,這意味著T推匯出為int并且引數型別是const int&&。
但是在特殊的轉發參考情況下,雖然P仍然從T&&to轉換T,但它最初是轉發參考的事實導致將引數型別替換為相應的左值參考型別(如果引數是左值)。因此,在 的情況下i,轉換后的引數型別是int&,而在 的情況下j,它是const int&。在這兩種情況下,T都以使其與轉換后的引數型別相同的方式T推導,這意味著推導為參考型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368063.html
