Chương trình sau biên dịch với GCC 5.2, nhưng không phải với kêu vang 3.6:là thông báo lỗi này đúng: không kiểu mẫu lập luận không phải là một biểu thức hằng
constexpr bool flag();
template <bool b = flag()>
constexpr bool test()
{
return b;
}
int main()
{
}
Thông báo lỗi tôi nhận được với kêu vang là:
main.cpp:3:20: error: non-type template argument is not a constant expression
template <bool b = flag()>
^~~~~~
main.cpp:3:20: note: undefined function 'flag' cannot be used in a constant expression
main.cpp:1:16: note: declared here
constexpr bool flag();
^
main.cpp:4:16: error: no return statement in constexpr function
constexpr bool test()
^
Câu hỏi của tôi là: Ai là đúng? Hay nói cách khác: Chương trình có hình thành không?
Có thể xác nhận điều này, thậm chí cả tiếng kêu 3.7 không biên dịch nó. Tuy nhiên, nếu bạn đặt câu lệnh return vào 'constexpr bool flag()', nó hoạt động. – vsoftco
Tôi nghĩ rằng điều này liên quan đến câu hỏi khác của bạn về điểm mà đối số mẫu mặc định được đánh giá: Nếu chúng được đánh giá tại điểm định nghĩa, thì clang không thể chứng minh rằng mẫu này không đúng định dạng trong [temp.res] p8 – dyp
bạn có câu lệnh return trong hàm void không? Tôi cũng có thể xác nhận rằng điều này biên dịch trên MSVS 2015 – NathanOliver