2015-02-16 14 views
18

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)) 
+0

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

+0

@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

+0

'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) –

Trả lời

12

Về cơ bản, trong một sizeof hoặc decltype biểu hiện bạn có thể gọi chức năng mà không phải thực hiện bất cứ nơi nào (họ cần phải được khai báo, không được thực hiện).

Ví dụ:

class Silly { private: Silly(Silly const&) = delete; }; 

auto foo() -> Silly&&; 

auto main() -> int 
{ 
    sizeof(foo()); 
} 

Trình liên kết không nên phàn nàn về điều đó.

+0

Ahh, ok, bây giờ nó có ý nghĩa tại sao "thêm một tham chiếu rvalue" hiện các trick. Vì một lý do nào đó, tôi không biết bạn có thể sử dụng 'decltype' trên các hàm được khai báo. Điều duy nhất tôi vẫn còn một chút bối rối là lý do tại sao bạn có thể gọi '.f()' trong 'declval () .f()', tôi đã có thể nghĩ rằng bạn cần một cái gì đó như 'declval () :: f () ' – vsoftco

+2

@vsoft trong một ngữ cảnh không được đánh giá, tất cả những vấn đề đó là các loại. Bạn không cần instance để sử dụng instance: bạn chỉ cần giả vờ. Điều gì, sau khi tất cả, là âm thanh của một bàn tay rơi xuống trong rừng nếu có hai bài hát trolly? – Yakk

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