2014-12-04 46 views
10

下面的代碼在GCC-4.8.2 鏘VS GCC - 可變參數模板參數包,然後用參數默認值在GCC 4.8的作品,但不鐺3.5

#include <iostream> 
using namespace std; 

template<typename... Args> 
void func(Args... args, int optional = 0) 
{ 
    cout << optional << endl; 
} 

int main() 
{ 
    func(1); 
    func(2.1f); // converts 2.1 to int as 'optional' parameter 
    func<float>(3.3f); // Fine, prints '0' 
    func(); // gcc OK, fails to compile with clang-3.5 
} 

,並將其輸出:

$ ./a.out 
1 
2 
0 
0 

但如果失敗,鐺 - 3.5編寫,

test_variadic.cpp:15:2: error: no matching function for call to 'func' 
    func(); 
    ^~~~ 
test_variadic.cpp:5:6: note: candidate function template not viable: requires at least argument 'args', but no arguments were provided 
void func(Args... args, int optional = 0) 
    ^

鏘至少警告的從float到int的隱式轉換。好吧,我們可以通過調用func<float>來修正這個問題,將float參數放入模板包中。所以,如果我註釋掉func(),它編譯得很好。

我在標準中找不到任何東西,明確指出可變參數模板包必須是參數聲明子句中的最後一件事,只是它變成了非推導的上下文。

我的困惑來自爲什麼鏗鏘不喜歡func()func(1)是完全可以接受的。我可以手動定義func(int optional = 4) { cout << optional << endl; },一切都很好(但經過int當代替模板函數我正確地得到在這兩個鐺和gcc專業func()什麼是限制使用的func()

+3

[工程鐺3.5(http://coliru.stacked-crooked.com/a/6d2184a139335a5b) – 2014-12-04 22:03:57

+0

這裏是我的是什麼版本使用, '$鐺--version Ubuntu的鐺版本3.5-1ubuntu1(主幹)(基於LLVM 3.5)靶:x86_64的-PC-Linux的GNU ' 和命令 '鐺++ -std = C + +11 -O2 -Wall -pedantic test_variadic。cpp' – ilektron 2014-12-04 22:13:00

+1

有趣。相同的命令行,但版本爲「Ubuntu clang版本3.5.0-svn217640-1〜exp1(branches/release_35)(基於LLVM 3.5.0)」僅編譯警告。 – 2014-12-05 03:21:01

回答

3

這實際上是涵蓋鐺採取強制執行措施由稍微錯位的[temp.arg.explicit]/3

尾隨模板參數包(14.5.3)不 否則推導出將被推斷爲模板參數空序列

模板參數包尾隨並因此推斷爲除func<float>(3.3f)之外的所有呼叫中的空包,即它們全部有效(並且Clang將它們編譯爲as of 3.5)。


但是,編譯器不符合了,一旦我們調整模板的聲明

template <typename... Args, typename=void> 
void func(Args... args, int optional = 0) 

現在,上述報價並不適用(如Args沒有拖尾)和[temp.deduct.call]/1適用代替:

當函數參數包出現在未推導的上下文 (14.8.2.5)中時,該參數包的類型是neve r推導出來的。

(即本應產生扣除失敗。)

+0

你介意在http://llvm.org/bugs/enter_bug.cgi?product=clang – ismail 2014-12-06 19:44:09

+0

@ilektron提交叮噹bug:我調整了這個答案,因爲[在這裏的討論](https://llvm.org/bugs/show_bug.cgi?id=21774)。 – Columbo 2016-03-07 17:04:16