下面的代碼在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.5(http://coliru.stacked-crooked.com/a/6d2184a139335a5b) – 2014-12-04 22:03:57
這裏是我的是什麼版本使用, '$鐺--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
有趣。相同的命令行,但版本爲「Ubuntu clang版本3.5.0-svn217640-1〜exp1(branches/release_35)(基於LLVM 3.5.0)」僅編譯警告。 – 2014-12-05 03:21:01