2016-08-04 20 views
10

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ó?

+0

“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? –

+0

Trình biên dịch nào không biên dịch được? – ecatmur

+1

@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. –

Trả lời

1

bạn đang tìm kiếm noexcept(std::is_nothrow_move_constructible<T>::value): http://en.cppreference.com/w/cpp/types/is_move_constructible

+4

Điều này dường như không hoạt động vì hàm khởi tạo di chuyển được bảo vệ và đặc điểm không có quyền truy cập vào nó. –

+0

@ JohannesSchaub-litb dường như bạn phải thêm là bạn của lớp cơ sở. –

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