2011-02-08 49 views
60

Tôi đoán là không, nhưng tôi muốn xác nhận. Có sử dụng nào cho const Foo&&, trong đó Foo là loại lớp không?Tham chiếu rvalue cho const có sử dụng không?

+1

Trong video này, STL nói 'const && 'rất quan trọng, mặc dù anh ấy không nói tại sao: https://www.youtube.com/watch?v=JhgWFYfdIho#t=54m20s –

Trả lời

57

Đôi khi chúng hữu ích. Dự thảo C++ 0x bản thân sử dụng chúng ở một vài nơi, ví dụ:

template <class T> void ref(const T&&) = delete; 
template <class T> void cref(const T&&) = delete; 

Hai quá tải trên đảm bảo rằng các ref(T&)cref(const T&) các chức năng khác không liên kết với rvalues ​​(mà nếu không sẽ có thể).

Cập nhật

Tôi vừa mới kiểm tra các tiêu chuẩn chính thức N3290, mà tiếc là không công bố rộng rãi, và nó có trong các đối tượng 20,8 Function [function.objects]/p2:

template <class T> void ref(const T&&) = delete; 
template <class T> void cref(const T&&) = delete; 

Sau đó, tôi đã kiểm tra bản nháp sau C++ 11 gần đây nhất, có sẵn công khai, N3485 và trong 20.8 đối tượng chức năng [function.objects]/p2 nó vẫn nói:

template <class T> void ref(const T&&) = delete; 
template <class T> void cref(const T&&) = delete; 
+0

Nhìn vào [cppreference] (http://en.cppreference.com/w/cpp/utility/functional/ref) có vẻ như đây không phải là trường hợp nữa. Bất kỳ ý tưởng tại sao? Bất kỳ nơi nào khác 'const T && 'được sử dụng? – Pubby

+0

Thực ra, cppreference có thể không hiển thị các chức năng đã xóa. Chưa kiểm tra tiêu chuẩn. – Pubby

+0

@Pubby cppreference chắc chắn hiển thị các chức năng đã xóa, những chức năng này bị bỏ qua do nhầm lẫn. – Cubbi

2

Chúng được cho phép và thậm chí chức năng được xếp hạng dựa trên const, nhưng vì bạn không thể di chuyển từ đối tượng const được giới thiệu bởi const Foo&&, chúng không hữu ích.

+0

Chính xác thì ý của bạn là gì "xếp hạng" nhận xét? Một cái gì đó để làm với độ phân giải quá tải, tôi đoán? – fredoverflow

+0

Tại sao bạn không thể di chuyển từ một const rvalue-ref, nếu kiểu đã cho có một ctor di chuyển lấy một giá trị const rvalue-ref? –

+3

@FredOverflow, xếp hạng quá tải là: 'const T &, T &, const T &&, T &&' –

1

Tôi không thể nghĩ ra một tình huống mà điều này sẽ có ích trực tiếp, nhưng nó có thể được sử dụng gián tiếp:

template<class T> 
void f(T const &x) { 
    cout << "lvalue"; 
} 
template<class T> 
void f(T &&x) { 
    cout << "rvalue"; 
} 

template<class T> 
void g(T &x) { 
    f(T()); 
} 

template<class T> 
void h(T const &x) { 
    g(x); 
} 

T trong g là T const, do đó f 'sx là một T const & &.

Có khả năng kết quả này trong một lỗi comile trong f (khi nó cố gắng để di chuyển hoặc sử dụng các đối tượng), nhưng f có thể mất một rvalue-ref để nó không thể được gọi vào lvalues, mà không sửa đổi rvalue (như trong ví dụ quá đơn giản ở trên).

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