![](/img/trans.png)
[英]g++ and clang++ different behaviour with pointer to variadic template functions
[英]g++ and clang++ different behaviour with variadic container
為了練習 C++11,我正在使用可變參數模板。
特別是,我正在使用一種遞歸可變參數容器類 ( onion
) 和一個返回模板類型數量的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 中的編譯器錯誤。 如果我使用主干版本運行代碼,它會很好地編譯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.