簡體   English   中英

g++ 和 clang++ 與可變參數容器的不同行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM