Mã:Chương trình với "noexcept" constructor chấp nhận bởi gcc, bị từ chối bởi kêu vang
struct T { T() {} };
struct S
{
T t;
S() noexcept = default;
};
int main()
{
// S s;
}
g ++ 4.9.2 chấp nhận này không có lỗi hoặc cảnh báo, tuy nhiên Clang 3.6 và 3.7 báo cáo cho dòng 7:
error: exception specification of explicitly defaulted default constructor does not match the calculated one
Tuy nhiên, nếu dòng S s;
không nhận xét ra, g ++ 4.9.2 giờ đây báo cáo:
noex.cc: In function 'int main()':
noex.cc:12:7: error: use of deleted function 'S::S()'
S s;
^
noex.cc:7:5: note: 'S::S() noexcept' is implicitly deleted because its exception-specification does not match the implicit exception-specification ''
S() noexcept = default;
^
Trình biên dịch nào phù hợp với mã gốc?
Bối cảnh:
g ++ thậm chí cho phép sau đây để được thêm vào main
:
std::cout << std::is_constructible<S>::value << '\n';
mà kết quả đầu ra 0
. Tôi gặp phải vấn đề này khi sử dụng clang để biên dịch một số mã phức tạp đã sử dụng nhiều mẫu, SFINAE và không nhận dạng. Trong mã đó S
và T
là các lớp mẫu; do đó, hành vi phụ thuộc vào loại S
được khởi tạo với. Clang từ chối nó với lỗi này cho một số loại, trong khi g ++ cho phép nó và SFINAE hoạt động dựa trên is_constructible
và các đặc điểm tương tự.
Bởi vì trong S constructor bạn sẽ nhận được cuộc gọi đến T constructor có thể ném bất kỳ exception.Clang là đúng, tôi tin rằng –
@SeverinPappadeux đó là sự thật về ngoại lệ nhưng vấn đề có vẻ là liệu mã có nên bị từ chối ngay lập tức hay không cho dù hiệu ứng của '= default' nên được * xác định là xóa * mà g + + có vẻ là làm. –