cv限制符
decltype可以帶走cv限制符恩伺,這一點跟auto不同赴背,auto帶不走。
但cv限制符不會擴散到成員變量晶渠,也比較好理解凰荚。
#include <type_traits>
#include <iostream>
using namespace std;
const int ic = 0;
volatile int iv;
struct S { int i; };
const S a = {0};
volatile S b;
volatile S* p = &b;
int main() {
cout << is_const<decltype(ic)>::value << endl; // 1
cout << is_volatile<decltype(iv)>::value << endl; // 1
cout << is_const<decltype(a)>::value << endl; // 1
cout << is_volatile<decltype(b)>::value << endl; // 1
cout << is_const<decltype(a.i)>::value << endl; // 不會擴散到成員變量,0
cout << is_volatile<decltype(p->i)>::value << endl; // 不會擴散到成員變量褒脯,0
}
冗余符號
與auto一樣便瑟,decltype后面可以跟著&和,多余的&不會變成右值引用番川,而是被吃掉到涂,但多余的會累加上,變成指針的指針**颁督,與auto不一樣践啄。
#include <type_traits>
#include <iostream>
using namespace std;
int i = 1;
int & j = i;
int * p = &i;
const int k = 1;
int main() {
decltype(i) & var1 = i; // int&
decltype(j) & var2 = i; // 也是int&,多余的一個&被吃掉
cout << is_lvalue_reference<decltype(var1)>::value << endl; // 1
cout << is_rvalue_reference<decltype(var2)>::value << endl; // 0
cout << is_lvalue_reference<decltype(var2)>::value << endl; // 1
// decltype(p)* var3 = &i; // compile err
decltype(p)* var3 = &p; // var3是int**
auto* v3 = p; // v3是int*沉御,auto跟decltype不一樣屿讽,會吃掉多余的*
v3 = &i;
const decltype(k) var4 = 1; // 多余的const被吃掉,理所應當
}