注意:此问题是由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
答案 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。