Tôi đang cố gắng hiểu cách hoạt động của std::declval<T>()
. Tôi biết làm thế nào để sử dụng nó, và biết những gì nó làm, chủ yếu là cho phép bạn sử dụng decltype
mà không cần xây dựng các đối tượng, nhưLàm thế nào để std :: declval <T>() hoạt động?
decltype(std::declval<Foo>().some_func()) my_type; // no construction of Foo
Tôi biết từ cppreference.com rằng std::declval<Foo>
"thêm" một tài liệu tham khảo rvalue để Foo
, mà do quy tắc thu gọn tham chiếu kết thúc bằng tham chiếu rvalue hoặc tham chiếu lvalue. Câu hỏi của tôi là tại sao các nhà xây dựng của Foo
không được gọi? Làm cách nào để có thể triển khai phiên bản "đồ chơi" của std::declval<T>
mà không xây dựng thông số mẫu?
PS: I know nó không phải là giống như các thủ thuật cũ
(*(T*)(nullptr))
Từ cùng một trang: "Lưu ý rằng vì không có định nghĩa tồn tại cho từ chối, nó chỉ có thể được sử dụng trong ngữ cảnh không được đánh giá; nó là một lỗi để đánh giá một biểu thức có chứa chức năng này." –
@remyabel có, tôi thấy rằng, tôi chỉ không biết làm thế nào để "xây dựng" của riêng tôi 'declval' – vsoftco
'mẫu < class T > typename std :: add_rvalue_reference :: type declval();' nghĩa đen là tất cả những gì bạn cần. [Live example] (http://coliru.stacked-crooked.com/a/9a8d4e5cfa60355f) –