gpt4 book ai didi

c++ - initializer_list 作为数组引用参数的参数?

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

下面对 foo 的调用是否有效? GCC 似乎对此很满意,而 Clang 为 foo 给出了“无匹配函数”错误;以及无法推断出 N 的注释。

template <unsigned N>
void foo(const int (&x)[N]) {}

int main(int argc, char *argv[])
{
foo({1,2,3});
return 0;
}

最佳答案

编辑:随着CWG issue 1591决议的通过在委员会 2014 年 11 月的 session 上,现在允许使用 OP 中的代码。编译器现在可以推断出数组中元素的类型和数量。


§14.8.2.5 [temp.deduct.type]/p5:

The non-deduced contexts are:

  • [...]
  • A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type.
  • [...]

您的初始化列表是一个非推导的上下文,因此 clang 正确地拒绝了您的代码。

可以想象,在这种情况下,g++ 可以支持演绎作为扩展。然而,因为它rejects此代码带有“推断的冲突值”错误:

template<unsigned N>
struct C { };

template <unsigned N>
void foo(C<N>, const int (&x)[N]) {}

int main(int argc, char *argv[])
{
foo(C<4>(), {1,2,3});
return 0;
}

在我看来这像是一个错误。 (在上面代码中对foo的调用中,编译器应该根据标准只从第一个参数推导出N,所以应该没有冲突。g++也从第二个参数中推导了 N,从而造成了冲突。这改变了格式良好的程序的行为,这对于符合要求的扩展是不允许的。)

关于c++ - initializer_list 作为数组引用参数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494345/

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