gpt4 book ai didi

c++ - std::initializer_list({1,2,3}) 和 {1,2,3} 有什么区别?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:57 25 4
gpt4 key购买 nike

我有以下模板函数:

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})

最佳答案

A braced-init list不是表达式,因此没有类型。当你打电话时

foo2({1,2,3});

编译器不知道是什么类型{1,2,3}代表在你的脑海里,所以它不会编译。

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

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

第三次调用也可以编译,因为编译器可以推断出类型。 std::initializer_list<int>({1,2,3})显然是 std::initializer_list<int> , 所以它可以初始化 t与传递的纯右值。

关于c++ - std::initializer_list<int>({1,2,3}) 和 {1,2,3} 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41635324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com