回顾C++11标准特性(1)

今天突发奇想不想使用cout进行输出信息了,想把cout换成自己任意指定的非关键词变量名字进行输出

#include <iostream>
using namespace std;

int main(){
    decltype(cout) &shit = cout;
    shit<<"i am piece of shit"<<endl;
    return 0;                
}

需要注意的是,我是用g++进行编译的时候需要指明使用的标准

g++ shit.cpp -o shit -std=c++11

这样就实现了使用shit替换cout的目的.

获取类型在c++11标准中有两个操作符,一个是auto一个是decltype不同的是auto好像只能获取基础类型的类型信息,如果是自定义类型,就有问题

事实证明

auto &shit = cout

也可以正常执行

auto是通过右值进行推导类型,而decltype像是一个函数,传入表达式或者对象作为参数可以获得其类型

decltype类型指示符的详细细节

  • delctype接表达式作为参数,针对只含有一个变量的表达式和不是一个变量的表达式表现不同的效果
  • delctype接只含有一个变量的表达式则返回这个变量的类型,包括顶层const和引用在内,这一点和auto不同,auto不能得到一个变量的顶层const,也不能操作引用,因为它认为引用并非是对象,所以auto对引用的操作,实际上是对引用指向的对象的操作。
  • delctype接不是一个变量的表达式的时候,如果这个表达式可以作为左值,则返回引用类型,否则则返回普通类型
  • 需要注意的是如果decltype接的是只含有一个变量的表达式,且给这个变量再加上一个括号,则现在可以认为decltype接的是非一个变量的表达式

Eg:

int i = 10;
decltype(i) a;//等同于 int a
decltype((i))b;//等同于int &b

就是因为加了个括号,且i能作为左值,同样类似的有解引用操作符表达式

int *p = &i;
decltype(*p) c;//等同于int &c,因为*p也可以作为左值

auto的特殊之处

  • auto不能推导出顶层const的类型限制,详见c++primer p62

相关推荐