gpt4 book ai didi

c++ - 为什么我的模板不接受初始化列表

转载 作者:IT老高 更新时间:2023-10-28 21:35:13 25 4
gpt4 key购买 nike

我已经创建了一个模板如下

template<typename T>
void f(T const& t) { }

我希望它可以被容器调用,也可以被初始化列表调用。我以为会是 initializer_list<int> , 调用时如下。

f({1, 2, 3});

但是 GCC 表现得好像它不符合标准

m.cpp: In function 'int main()':
m.cpp:6:25: warning: deducing 'const T' as 'const std::initializer_list<int>'
m.cpp:4:6: warning: in call to 'void f(const T&) [with T = std::initializer_list<int>]'
m.cpp:6:25: warning: (you can disable this with -fno-deduce-init-list)

谁能解释我如何在没有警告的情况下完成这项工作?谢谢!

最佳答案

像 {1,2,3} 这样的“事物”不符合表达式的条件。它没有类型。因此,没有进行类型推导。但是 C++0x 为 'auto' 做了一个明确的异常(exception),所以

auto x = {1,2,3};

实际上有效,decltype(x) 将是 initializer_list<int> .但这是一条仅适用于汽车的特殊规则。我猜他们想制作这样的循环

for (int x : {2,3,5,7,11}) {
...
}

工作,因为这种循环利用了特殊规则。

至于解决问题,您可以添加 initializer_list<T>重载为“包装器”:

template<class T>
inline void outer(initializer_list<T> il) {
inner(il);
}

我没有对此进行测试,但我目前的理解是它应该可以工作。

关于c++ - 为什么我的模板不接受初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4757614/

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