簡體   English   中英

std :: initializer_list有什么區別 <int> ({1,2,3})和{1,2,3}?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM