g++ 和 clang++ 可变容器的不同行为
g++ and clang++ different behaviour with variadic container
为了练习 C++11,我正在使用可变参数模板。
特别是,我正在玩一种递归可变参数容器 class (onion
) 和一个函数 returns 模板类型的数量 (func()
).
我遇到过clang++(3.5.0)无法编译,而g++(4.9.2)编译运行没问题的情况。
我简化如下
#include <iostream>
template <typename F, typename ... O>
struct onion;
template <typename F, typename S, typename ... O>
struct onion<F, S, O...>
{
F first;
onion<S, O...> others;
};
template <typename L>
struct onion<L>
{ L last; };
template <typename ... Args>
std::size_t func (onion<Args...> const &)
{ return sizeof...(Args); }
int main()
{
auto o = onion<int, char const *, float> { 23, { "abcd", {34.0f}} };
std::cout << func(o) << '\n';
return 0;
}
clang++ (3.5.0) 给我以下编译器错误
test.cpp:28:17: error: no matching function for call to 'func'
std::cout << func(o) << '\n';
^~~~
test.cpp:20:13: note: candidate template ignored: substitution
failure [with Args = <>]: too few template arguments for class template
'onion'
std::size_t func (onion<Args...> const &)
^ ~~~~~
1 error generated.
g++ (4.9.2) 编译没有问题,运行,输出 3
.
我的问题是:谁是对的?
clang++,报错,还是g++,编译?
我补充一下如果我这样重写func()
template <typename X, typename ... Args>
std::size_t func (onion<X, Args...> const &)
{ return 1U + sizeof...(Args); }
或者如果我以这种方式重新定义onion
template <typename ... O>
struct onion;
clang++ 和 g++ 编译都没有错误。
这看起来像是 clang 3.5 中的编译器错误。
如果我 运行 使用 t运行k 版本的代码,它编译得很好。
为了练习 C++11,我正在使用可变参数模板。
特别是,我正在玩一种递归可变参数容器 class (onion
) 和一个函数 returns 模板类型的数量 (func()
).
我遇到过clang++(3.5.0)无法编译,而g++(4.9.2)编译运行没问题的情况。
我简化如下
#include <iostream>
template <typename F, typename ... O>
struct onion;
template <typename F, typename S, typename ... O>
struct onion<F, S, O...>
{
F first;
onion<S, O...> others;
};
template <typename L>
struct onion<L>
{ L last; };
template <typename ... Args>
std::size_t func (onion<Args...> const &)
{ return sizeof...(Args); }
int main()
{
auto o = onion<int, char const *, float> { 23, { "abcd", {34.0f}} };
std::cout << func(o) << '\n';
return 0;
}
clang++ (3.5.0) 给我以下编译器错误
test.cpp:28:17: error: no matching function for call to 'func'
std::cout << func(o) << '\n';
^~~~
test.cpp:20:13: note: candidate template ignored: substitution
failure [with Args = <>]: too few template arguments for class template
'onion'
std::size_t func (onion<Args...> const &)
^ ~~~~~
1 error generated.
g++ (4.9.2) 编译没有问题,运行,输出 3
.
我的问题是:谁是对的?
clang++,报错,还是g++,编译?
我补充一下如果我这样重写func()
template <typename X, typename ... Args>
std::size_t func (onion<X, Args...> const &)
{ return 1U + sizeof...(Args); }
或者如果我以这种方式重新定义onion
template <typename ... O>
struct onion;
clang++ 和 g++ 编译都没有错误。
这看起来像是 clang 3.5 中的编译器错误。 如果我 运行 使用 t运行k 版本的代码,它编译得很好。