Tôi đang chuyển một mã C++ 14- constexpr
từ Clang sang g ++ - 5.1 mới nhất. Xem xét giảm đoạn mã sau đây của một bitset
lớp cây nhà lá vườn mà đã được biên soạn một cách chính xác kể từ lễ nhậm của Clang 3,3 (gần 2 năm nay!)Constexpr không được phép khai báo chuyên môn về mẫu bạn bè?
#include <cstddef>
template<std::size_t>
class bitset;
template<std::size_t N>
constexpr bool operator==(const bitset<N>& lhs, const bitset<N>& rhs) noexcept;
template<std::size_t N>
class bitset
{
friend constexpr bool operator== <>(const bitset<N>&, const bitset<N>&) noexcept;
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <-- error from this piece
};
template<std::size_t N>
constexpr bool operator==(const bitset<N>& /* lhs */, const bitset<N>& /* rhs */) noexcept
{
return true;
}
int main() {}
Live example trên Wandbox. Tuy nhiên, g ++ - 5.1 và phiên bản thân hiện nay đưa ra một lỗi:
'constexpr' is not allowed in declaration of friend template specialization
Câu hỏi: đây là một g ++ lỗi được biết hoặc được Clang không phù hợp với các tiêu chuẩn mới nhất?
Note: ở trên chỉ sử dụng C++ 11 phong cách constexpr
tính năng, vì không có những thay đổi đang diễn ra bên trong operator==
, vì vậy có vẻ như một số can thiệp lạ giữa các mẫu, bạn bè và constexpr.
CẬP NHẬT: được gửi dưới dạng bug 65977 trên Bugzilla.
Và 4.8.2 phàn nàn về [một thông số nội tuyến 'không liên quan'] (http://melpon.org/wandbox/permlink/ZNUj29hUVVn5RgJr) ... – Columbo
Tôi không thấy bất kỳ câu trả lời rõ ràng nào cho điều này, có thể là hữu ích để mở một báo cáo lỗi gcc, đặc biệt là do sự khác biệt của chúng được thực hiện giữa clang và gcc. Tôi không thấy bất kỳ khiếm khuyết nào liên quan đến điều này và mặc dù câu trả lời của Marco có lẽ đúng, nhưng nó không rõ ràng là đúng với tôi. –
Cá nhân tôi đã để lại tiền thưởng tại chỗ để câu trả lời có thể đã nhận được nhiều phiếu bầu hơn. Đó là một câu trả lời hoàn hảo và xứng đáng hơn 2 phiếu bầu. –