当前位置:  开发笔记 > 编程语言 > 正文

std :: initializer_list <int>({1,2,3})和{1,2,3}之间有什么区别?

如何解决《std::initializer_list<int>({1,2,3})和{1,2,3}之间有什么区别?》经验,为你挑选了1个好方法。

我有以下模板功能:

template void foo2(T t) {}

我知道我不能用它来调用它:

foo2({1,2,3});

因为初始化列表是模板参数的非推导上下文.我必须使用:

foo2>({1,2,3});

但我也可以用:

foo2(std::initializer_list({1,2,3}));

这让我想知道有什么区别:{1,2,3}std::initializer_list({1,2,3})



1> Rakete1111..:

撑-INIT列表不是表达式,并且因此不具有类型.你打电话的时候

foo2({1,2,3});

编译器不知道{1,2,3}你脑子里代表什么类型,所以它不编译.

foo2>({1,2,3});

编译,因为在这里编译器不必推断类型,你已经指定了它,它是std::initializer_list.因此,它可以初始化t{1,2,3}.

第三个调用也会编译,因为编译器可以推断出类型.std::initializer_list({1,2,3})显然是一个std::initializer_list,所以它可以t用传递的prvalue 初始化.


请注意,在C++ 17中,"保证省略"规则使您的最后一段不同.从某种意义上说,在那里创建的值不再被省略到函数参数; 它只是一种初始化函数参数的方法.或者我收集,我还没有掌握新规则.(在实践中,这种情况下没有区别)
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有