首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么{1,2}没有类型,但解密类型(A)是格式良好的?

为什么{1,2}没有类型,但解密类型(A)是格式良好的?
EN

Stack Overflow用户
提问于 2014-11-29 06:10:53
回答 2查看 273关注 0票数 2

标准说braced-init-list没有任何类型。所以我预计像auto a = {1, 2};这样的东西是畸形的。但这根本不是真的。

代码语言:javascript
复制
#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>。对我来说,它与初始化程序列表没有类型相矛盾。怎么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)生成相同的类型。

票数 3
EN

Stack Overflow用户

发布于 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. [

代码语言:javascript
复制
Example:
auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27199478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档