<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:\Project\a.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》第五版 ,学到第二章了。