函数采用可变数量的不同类型的initializer_lists

时间:2013-11-24 15:18:18

标签: c++ templates gcc c++11 clang

注意:此问题是由clang

中的错误引起的

在尝试编写一个函数,其中任意数量的intitializer_list s类型不需要匹配时,我偶然发现了一个奇怪的错误:

template <typename... Ts>
void function(std::initializer_list<Ts> &&  ...args){

}

int main() {
    function({1,2,3}, {'h', 'w'}, {"hello", "aloha"});
    return 0;
}

字符串文字在clang下导致问题,但在gcc下没有问题-pedantic -Wall -Wextra没有警告任何扩展名。

clang产生错误:

error: no matching function for call to 'function'
    function({1,2,3}, {'h', 'w'}, {"hello", "aloha"});
    ^~~~~~~~
note: candidate function [with Ts = <int, char, char const[6]>] not
      viable: no known conversion from 'const char [6]' to 'char const[6]' for
      3rd argument
void function(std::initializer_list<Ts> &&  ...args){
     ^

所以有几个问题: clang是否错误拒绝这个或gcc是否使用扩展来推断出arrayizer的initializer_list?或者更糟糕的是gcc只传递错误代码?

这是否相当于传递initializer_list initializer_list s当然是不允许的?

const char[6]char const[6]之间的区别是什么?

详细说明:

clang version 3.4(http://llvm.org/git/clang.git 9a65f4251fe5548e0b4478d584796ca84a6f5ebc)(http://llvm.org/git/llvm.git 4f67afc3d67d9a68f1b37767c9c2966a775186bd) 目标:x86_64-unknown-linux-gnu 线程模型:posix

gcc(Debian 4.7.2-5)4.7.2

Debian 7

1 个答案:

答案 0 :(得分:3)

这是clang中的一个错误:在针对{"hello", "aloha"}推断std::initializer_list<Ts>时,它无法执行所需的数组到指针衰减,但仅当Ts是参数包时才会执行。< / p>

此计划compiles fine

#include <initializer_list>

template <typename T>
void function(std::initializer_list<T> il) {
}

int main() {
    function({"hello", "aloha", "foobarbaz"});
}

但是这个程序triggers the bug

#include <initializer_list>

template <typename... T>
void function(std::initializer_list<T>... il) {
}

int main() {
    function({"hello", "aloha", "foobarbaz"});
}

修改:无法在the LLVM bugzilla tracker中找到此错误,提交为bug# 18047