zoukankan      html  css  js  c++  java
  • C++11:"auto"和"decltype"类型说明符的思考

    <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》第五版 ,学到第二章了。








  • 相关阅读:
    JavaScript 获取CSS媒体查询信息
    拖拉事件
    JavaScript 中的正常任务与微任务
    IOS 采用https 协议访问接口
    将类数组 转化为数组
    合并两个数组的方法
    base64转码
    Promise 异步执行的同步操作
    proxy set 拦截
    VIm 一些常用的设置
  • 原文地址:https://www.cnblogs.com/vczf/p/6823266.html
Copyright © 2011-2022 走看看