在C++11标准后,auto从一个帮助编译器判断是否放在寄存器中的标志符,变成了用于自动推导变量类型的标志符.在初始化变量时,类型可以直接写作auto,由编译器从后面的赋值表达式,推导出实际的类型,免去输入复杂类型的麻烦.
而最近在使用的过程中,发现了一点奇怪的现象:
1 2 3 4 5 6 7 8 9 10 11 |
auto val = new int(5);//Type:int* auto* val2 = new int(5);//Type:int* auto& val6 = val; //Type:int*& const auto val7 = val;// Type:int* const int i = 0; auto val8 = i; //Type:int auto* val9 = i;//Type:Unknown(Error) decltype(auto) val4 = static_cast<int*&>(val);//Type int*& auto val5 = static_cast<int*&>(val); //Type int* |
从上面的第一段代码,可以发现auto,auto所推导出的结果是相同的,而对于&,cv标识符则会正常地附着到最终的类型上.(文档中倒是说auto的推导,是按照模板推导那套理论进行的…不过也没特殊指出的情况….)
在第二段代码中,如果右侧的类型不是指针类型的话,auto会直接推导失败…也就是说也是参与推导过程的….?这样倒是说得通了,就像模板推导T&时推出的T不会是引用类型一样的.
第三段是发现的一个有趣的用法.使用decltype的情况,相当于使用decltype对赋值表达式进行推导,相对于普通的auto多出了对引用的感应.
PS2:f7(eiki)喜欢!
PS3:虽然说讲的通还是好奇怪….