<span style="font-family: Arial, Helvetica, sans-serif;">//例1</span>
<span style="font-family: Arial, Helvetica, sans-serif;">//编译器:gcc 4.8.1 系统:windows</span>
#include <iostream> int main() { int i = 1; auto a = i; decltype(i) d = 2; std::cout << "a: " << a << std::endl; std::cout << "d: " << d << std::endl; return 0; }
输出
</pre><pre name="code" class="cpp">a: 1 d: 2
由上可以看出”auto“和”decltype“都可以用来帮我们定义一个变量。
对于一个表达式,却不知道表达式的值的类型:
1.当我们想要赋值的时候,可以用”auto“;
2.当我们想要使用这个表达式的类型来定义一个变量的时候,可以用”decltype“;
共同点:
由例1基本类型的一般定义,”auto“和”dectype“还是共同的。
我们来看看复合类型指针;
例2:
#include <iostream> int main() { int i = 1, r1 = 2, *p = &i; auto a = p; decltype(p) d = &r1; std::cout << "a: " << *a << std::endl; std::cout << "d: " << *d << std::endl; return 0; }
输出:
a: 1 d: 2
可以看出对指针的处理,总的而言对于未”const“的类型,两者还是类似的。
区别:
我们来看看对顶层”const“的处理;
例3:
#include <iostream> int main() { const int i = 1; auto a = i; //会自动忽略顶层const,变为整形 a = 2; decltype(i) d = 3; //d的类型是 const int; std::cout << "a: " << a << std::endl; std::cout << "d: " << d << std::endl; return 0; }
输出:
a: 2 d: 3
可以看出”auto“会自动忽略顶层const 的特性;我们再给d赋值试试
例4:
#include <iostream> int main() { const int i = 1; auto a = i; //会自动忽略顶层const,变为整形 a = 2; decltype(i) d = 3; //d的类型是 const int; d = 4; std::cout << "a: " << a << std::endl; std::cout << "d: " << d << std::endl; return 0; }
输出:报错
D:Projecta.cpp:8:4: error: assignment of read-only variable 'd'
d = 4;
可以看出,”decltype“会保留顶层const的特性。
现在再来看看对引用的处理
#include <iostream> int main() { const int i = 1, &r1 = i; auto a = r1; //r1是i的别名,会自动忽略顶层const,变为整形 a = 2; decltype(r1) d = 3; //d的类型是 const int; std::cout << "a: " << a << std::endl; std::cout << "d: " << d << std::endl; return 0; }
输出:
a: 2 d: 3
和我们上面得出的结论类似。
decltype对表达式和引用的特殊处理
#include <iostream> int main() { int i = 1, &r1 = i; decltype(r1 + 0) d ; //加法的结果是int d = 1; int j = 2; decltype((i)) d1 = j; //多加一个括号,表示的是引用 int& std::cout << "d: " << d << std::endl; std::cout << "d1: " << d1<< std::endl; return 0; }
输出:
d: 1 d1: 2
啊仙的c++修行之路,参考《c++ primer》第五版 ,学到第二章了。