gpt4 book ai didi

c++ - 函数模板推导和initlializer_list

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

我有以下函数模板:

template <typename K, typename V>
void f(std::initializer_list<std::pair<const K, V>> il)
{
//...
}

我调用函数如下:

f({std::pair<const int,int>(1,2), std::pair<const int,int>(3,4)});    //(a)

而且效果很好。

但是,如果我尝试按如下方式调用它:

f({{1,2}, {3,4}});    //(b)

它无法推断出正确的类型,我得到了一个编译错误:

'no matching function for call to 'f(<brace-enclose initializer list>)
note candidate is:
note: template <class K, class V> void f(std::initializer_list<std::pair<const K, V>>)'

如果我这样调用它:

f({std::pair<const int,int>(1,2), {3,4}});    //(c)

类型推导有效,但如果我尝试按如下方式调用它:

f({std::make_pair(1,2), {3,4}});   //(d) 

我遇到了与之前相同的编译错误。

我的问题是:

为什么模板类型推导在 (c) 中有效,但在 (d) 中无效?

(编译器是 gcc v4.6.3,带有标志 -std=c++11)

我看过类似的、较旧的 SO 帖子,但它们似乎并没有完全回答这个问题。

最佳答案

b) 的问题在于编译器无法推断类型,因为类似

{1,2}

也可能被视为 initializer_list<int> , d) 的问题是 make_pair不会生成 const int对的第一部分

关于c++ - 函数模板推导和initlializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25834842/

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