繁体   English   中英

为什么{1,2}没有类型,但是decltype(a)格式正确?

[英]Why does {1, 2} has no a type, but decltype(a) is well-formed?

标准说braced-init-list没有类型。 所以我希望像auto a = {1, 2};这样的东西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(){ }

DEMO

而且decltype(a)std::initializer_list<int> 对我来说,它与没有类型的初始化列表矛盾。 怎么了?

decltype({1, 2})是非法的,但是,已经推导了a的类型。 最接近 C ++ 11标准N3337的草案

§7.1.6.4/ 6

一旦声明符-ID的类型已经根据8.3确定,使用说明符-ID的声明的变量的类型是从它的初始值设定的使用用于模板参数推导规则的类型确定。 T为为变量标识符d确定的类型。 通过用新的发明类型模板参数U替换auto的出现,或者如果初始化程序是braced-init-list (8.5.4)替换为std::initializer_list<U> ,从T获取P 然后,使用从函数调用(14.8.2.1)的模板参数推导规则确定的变量d推导类型A ,其中P是函数模板参数类型,而d的初始值设定项是相应的参数。 如果推导失败,则声明格式错误。 [ 示例:

 auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int> auto x2 = { 1, 2.0 }; // error: cannot deduce element type 

结束示例 ]

在您的问题上下文中,将括号初始列表推导为std::initializer_list<int> ,随后, decltype(a)产生相同的类型。

从c ++标准(7.1.6.4自动说明符)开始

7 ....如果占位符是自动类型说明符,则使用模板参数推导规则确定推导类型。 如果推导用于return语句,并且初始化程序是大括号的初始列表(8.5.4),则程序格式错误。 否则,通过用新的发明类型模板参数U替换auto的出现,或者如果初始化程序是braced-init-list,则用std :: initializer_list替换auto的出现,从T中获取P。 使用从函数调用(14.8.2.1)进行模板参数推导的规则推导出U的值,其中P是函数模板参数类型,而初始值设定项是相应的参数。 如果推导失败,则声明格式错误。 否则,可以通过将推导的U代入P来获得为变量或返回类型推导的类型。

Example:
auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM