在下面的代碼中,為什么decltype( c)回傳int&而不是intwhile decltype(a )return int。
#include <iostream>
#include <typeinfo>
int main()
{
int32_t a {};
decltype(a ) b; // OK
int32_t c{};
decltype( c) d; // error: 'd' declared as reference but not initialized
std::cout << "typeid(b) = " << typeid(b).name() << std::endl;
std::cout << "typeid(d) = " << typeid(d).name() << std::endl;
}
uj5u.com熱心網友回復:
內置的預遞增運算子的結果是一個參考運算元的左值(然后保存遞增后的值)。這意味著,例如, a = 1;是有效的。的結果是 a指變數a,它可以被賦值1。
內置的后增量運算子的結果是運算元的前一個值的純右值(它不能是參考運算元的左值,因為后增量應該給出增量之前的前一個值)。這意味著, ega = 1;無效,因為 的結果a 不是指a,而只是 的原始值a,并且不能為值分配值。
decltype應用于純右值運算式給出非參考。應用于左值運算式,它為運算式的型別提供左值參考。如果您多載了增量運算子,這模仿了您需要用來為運算式獲取相同值類別的回傳型別。
uj5u.com熱心網友回復:
這是標準中前綴和后綴運算子描述的結果。
cppreference有一個小表格,顯示兩個運算子的簽名,其中 ut 表示:
內置運算子的前綴版本回傳參考,后綴版本回傳值......
根據定義,預增量運算子回傳一個參考,就好像它已宣告:
T& T::operator ();
T& operator (T& a);
后增量運算子回傳一個值:
T T::operator (int);
T operator (T& a, int);
為避免錯誤嘗試
#include <type_traits>
//
// ...later...
//
std::remove_reference_t<decltype( c)> d;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485499.html
下一篇:在C 中自動參考地址
