Chúng tôi đã có tình trạng này và băn khoăn về cách tốt nhất để sửa chữa nóLàm thế nào tôi có thể nói "noexcept nếu thực hiện của constructor cơ sở được bảo vệ là noexcept"?
template<typename T>
struct A : T {
A(T &&t) noexcept(noexcept(T(std::move(t))))
:T(std::move(t))
{ }
};
này không may thất bại trong việc biên dịch vì constructor thái T được bảo vệ, và chúng tôi chỉ được phép gọi nó trong danh sách khởi tạo constructor cho *this
. Cách giải quyết để thực hiện công việc này hoặc thậm chí còn có một cách tiêu chuẩn cho nó?
“và chúng tôi chỉ được phép gọi nó trong danh sách khởi tạo constructor cho' * this'”- chờ đợi, những gì? Đây có phải là quy tắc đặc biệt cho các nhà xây dựng * được bảo vệ không? Bạn chỉ có thể sử dụng chúng trong danh sách khởi tạo? –
Trình biên dịch nào không biên dịch được? – ecatmur
@ecatmur Intel/GCC không thành công (Clang có thể là tốt). Như với tất cả các chức năng được bảo vệ, chỉ cho phép các cuộc gọi thông qua các đối tượng thuộc loại '* this' hoặc các lớp dẫn xuất. –