![](/img/trans.png)
[英]const auto std::initializer_list difference between Clang and GCC
[英]What is the difference between std::initializer_list<int>({1,2,3}) and {1,2,3}?
我有以下模板功能:
template<typename T> void foo2(T t) {}
我知道我不能用它來調用它:
foo2({1,2,3});
因為初始化列表是模板參數的非推導上下文。 我必須使用:
foo2<std::initializer_list<int>>({1,2,3});
但我也可以用:
foo2(std::initializer_list<int>({1,2,3}));
這讓我想知道: {1,2,3}
和std::initializer_list<int>({1,2,3})
什么區別?
braced-init列表不是表達式,因此沒有類型。 你打電話的時候
foo2({1,2,3});
編譯器不知道你的想法中代表什么類型{1,2,3}
,因此它不會編譯。
foo2<std::initializer_list<int>>({1,2,3});
編譯,因為這里編譯器不必推斷類型,你已經指定了它,它是std::initializer_list<int>
。 所以它可以用{1,2,3}
初始化t
。
第三個調用也會編譯,因為編譯器可以推斷出類型。 std::initializer_list<int>({1,2,3})
顯然是std::initializer_list<int>
,因此可以使用傳遞的prvalue初始化t
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.