2015-05-15 15 views
9

Sử dụng clang 3.6.0, tôi không thể biên dịch ví dụ mã sau.Có thể sử dụng biến mẫu `constexpr` làm mặc định cho đối số mẫu chính thức

#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; 
} 

Nhưng, các thông báo lỗi sau đây được trả về:

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

Có phải là [lỗi đã biết] (https://stackoverflow.com/questions/10721130/) – StenSoft

Trả lời

4

Như đã đề cập bởi @StenSoft, nó là một known bug. Nếu bạn cần để làm cho nó làm việc bởi vì bạn có một constexpr mẫu biến bạn muốn sử dụng làm mặc định, bạn có thể quấn giá trị mặc định vào một std::intergral_constant:

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

Live example

0

Đây không phải là cố định trong tiếng kêu 3.7. Báo cáo lỗi được đề cập bởi Daniel Frey liên quan đến các hàm constexpr (hiện đang hoạt động) nhưng không phải là các mẫu biến.

Các vấn đề liên quan