gcc-4.8接受此代碼,但是它沒有錯,因爲非類型參數包相當於void...
這是非法的嗎?是不是非類型參數包,評估爲「void ...」非法?
template <typename T,
typename std::enable_if<std::is_integral<T>::value>::type...>
void test(T) {}
我試過這與ng 3.5,以及它也接受它。這是一個編譯器錯誤,還是我誤解了一些東西?
下面的完整測試代碼,它使用非類型的空參數包來簡化enable_if。 這與Flaming Dangerzone's Remastered enable_if中的內容幾乎相同,除非替換後包變爲void...
。
#include <type_traits>
template < typename C >
using enable_if = typename std::enable_if<C::value>::type ;
template < typename T, enable_if<std::is_integral<T>>... >
void test(T){} // #1
template < typename T, enable_if<std::is_floating_point<T>>... >
void test(T){} //#2
int main()
{
test(0); // calls #1
test(0.0); // calls #2
return 0;
}
gcc-4.8很好的編譯上面的代碼。鏗鏘聲不會,但這是因爲它有一個不同的錯誤http://llvm.org/bugs/show_bug.cgi?id=11723。
我認爲這是非法的。參見該標準的段落[temp.param] 14.1/7:「非類型模板參數不應被聲明爲具有浮點,類或空類型。」 – Constructor
您應該提供自包含的代碼。我只能說所寫的代碼不能編譯,因爲缺少include和缺少main。 –
@ JohannesSchaub-litb請參閱[一個簡單的例子](http://ideone.com/hxuKmJ),它重現了這個問題。 – Constructor