标准说braced-init-list没有任何类型。所以我预计像auto a = {1, 2};这样的东西是畸形的。但这根本不是真的。
#include <iostream>
#include <initializer_list>
using namespace std;
auto a = {1, 2};
std::initializer_list<int> init_list = {1, 3, 6, 7};
decltype(a) b = init_list;
int main(){ }演示
此外,decltype(a)是std::initializer_list<int>。对我来说,它与初始化程序列表没有类型相矛盾。怎么了?
发布于 2014-11-29 06:27:35
decltype({1, 2})是非法的,但是a的类型已经被推导出来了。从最近的草案到C++11标准,N3337
§7.1.6.4/6
一旦根据8.3确定了声明符-id的类型,使用声明符-id的声明变量的类型将从其初始化器的类型中使用模板参数演绎规则确定。让
T是为变量标识符d确定的类型。通过将P的出现替换为新发明的类型模板参数U,或者,如果初始化器是大括号内列表(8.5.4),则用std::initializer_list<U>从T获取auto。然后,为变量d推导出的类型是使用函数调用(14.8.2.1)中的模板参数推导规则确定的A,其中P是函数模板参数类型,d的初始化器是相应的参数。如果扣减失败,则声明格式不正确。示例: auto x1 ={ 1,2 };//解密类型(X1)是std::initializer_list auto x2 ={ 1,2.0 };// error:无法推断元素类型 -最后一个例子
在您的问题的上下文中,大括号内的列表被推断为std::initializer_list<int>,随后,decltype(a)生成相同的类型。
发布于 2014-11-29 06:29:18
来自c++标准(7.1.6.4自动说明符)
7....If占位符是自动类型说明符,推导的类型是用模板参数推导规则确定的。如果扣减用于返回语句,而初始化程序是大括号内列表(8.5.4),则程序的格式不正确。否则,通过将auto的出现替换为新发明的类型模板参数U,或者,如果初始化器是大括号-init-列表,则用std::initializer_list替换T中的P。使用从函数调用(14.8.2.1)中的模板参数演绎规则导出U的值,其中P是函数模板参数类型,初始化器是相应的参数。如果扣减失败,则声明格式不正确。否则,通过将推导出的U替换为P. [
Example:
auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>https://stackoverflow.com/questions/27199478
复制相似问题