2015-05-15 25 views
9

clang 3.6.0 kullanma, aşağıdaki kod örneğini derleyemiyorum.'Constexpr' Şablonu Kullanılabilir Mümkün Bir Resmi Şablon Değişkeni için Varsayılan Olarak Değişken

#include <type_traits> 

template <typename T> constexpr bool IS_SCALAR = ::std::is_scalar<T>::value; 
template <typename T, bool = IS_SCALAR<T>> 
struct Class_Breaks 
{ 
}; 

template <typename T, bool = ::std::is_scalar<T>::value> 
struct Class_Works 
{ 
}; 

void function() 
{ 
    Class_Breaks<int> break_error; 
    Class_Breaks<int, IS_SCALAR<int>> breaks_ok; 
    Class_Works<int> ok; 
} 

Fakat, aşağıdaki hata iletileri döndürülür:

@StenSoft tarafından belirtildiği gibi
1> [ 66%] Building CXX object CMakeFiles/Core.dir/tests.cpp.obj 
1>D:\Projects\Core\Core\tests.cpp(4,30): error : non-type template argument is not a constant expression 
1> template <typename T, bool = IS_SCALAR<T>> 
1>        ^
1> D:\Projects\Core\Core\tests.cpp(16,18) : note: while checking a default template argument used here 
1>   Class_Breaks<int> break_error; 
1>   ~~~~~~~~~~~~~~~~^ 
1> 1 error generated. 
+4

[Bilinen bir hata] (https://stackoverflow.com/questions/10721130/) – StenSoft

cevap

4

, bir known bug olduğunu. Eğer burada varsayılan olarak kullanmak istediğiniz bir constexpr şablon değişkenini çünkü o iş yapmak gerekiyorsa, bir std::intergral_constant içine varsayılan değer sarabilirsiniz:

template< 
    typename T, 
    bool = std::integral_constant< bool, IS_SCALAR<T> >::value 
> 

Live example

0

Bu sabit değildir clang 3.7. Daniel Frey tarafından atıfta bulunulan hata raporu (şimdi çalışır) constexpr fonksiyonları ile ilgilidir, ancak değişken şablonlar değildir.

İlgili konular