Helpex - Trao đổi & giúp đỡ Đăng nhập
27

Tôi đang cố gắng hiểu tại sao ai đó lại viết một hàm có tham chiếu const rvalue .

Trong ví dụ mã bên dưới mục đích là hàm tham chiếu const rvalue (trả về "3"). Và tại sao độ phân giải quá tải lại ưu tiên giá trị const ở trên hàm tham chiếu const LValue (trả về "2").

#include <string>
#include <vector>
#include <iostream>

std::vector<std::string> createVector() { return std::vector<std::string>(); } 

//takes movable rvalue
void func(std::vector<std::string> &&p) { std::cout << "1"; }

//takes const lvalue
void func(const std::vector<std::string> &p)  { std::cout << "2"; }

//takes const rvalue???
//what is the point of const rvalue? if const I assume it is not movable?
void func(const std::vector<std::string> &&p) { std::cout << "3"; }

int main()
{
    func(createVector());
    return 0;
}
27 hữu ích 4 bình luận 4.2k xem chia sẻ
30

Các giá trị thực sự thích ràng buộc với các tham chiếu giá trị và các tham chiếu rvalue tương tự rất thích liên kết với các tham chiếu rvalue. Biểu thức có thể sửa đổi yếu thích liên kết với một tham chiếu không phải const.

Vì vậy, khi trình biên dịch của bạn đang thực hiện giải quyết quá tải, nó sẽ kiểm tra xem có quá tải nào cần tham chiếu rvalue hay không, bởi vì điều đó được ưu tiên mạnh mẽ. Trong trường hợp này, vì phép thử là một giá trị có thể sửa đổi, do đó, quá tải tham chiếu rvalue sẽ thắng.

Thực tế có sử dụng cho các tham chiếu const rvalue, chúng có thể được sử dụng để đảm bảo một thứ gì đó không liên kết với rvalue. Hãy nhớ rằng một rvalue liên kết với một tham chiếu const lvalue, do đó nếu bạn đã làm như vậy:

template <typename T> void foo(const T& bar) { /* ... */ }

Và được gọi là hàm với:

foo(createVector());

Nó sẽ hoạt động tốt. Tuy nhiên, đôi khi bạn muốn đảm bảo rằng bạn chỉ có thể truyền các giá trị cho một hàm (đây là trường hợp std::refcho một). Bạn có thể đạt được điều này bằng cách thêm một quá tải:

template <typename T> void foo(const T&&) = delete;

Hãy nhớ rằng, rvalues ​​thích liên kết mạnh với các tham chiếu rvalue và các biểu thức có thể sửa đổi thích liên kết yếu với các tham chiếu không phải const. Vì chúng ta có tham chiếu const rvalue, về cơ bản có nghĩa là mọi giá trị đơn lẻ sẽ liên kết với điều này, do đó nếu bạn cố gắng chuyển một giá trị đến foo(), trình biên dịch của bạn sẽ xuất hiện lỗi. Đây là cách duy nhất để đạt được chức năng như vậy và do đó đôi khi hữu ích.

30 hữu ích 5 bình luận chia sẻ
2

Độ phân giải quá tải thích const rvalue hơn const lvalue bởi vì, đó là một rvalue và bạn đang ràng buộc nó với một tham chiếu rvalue, nhưng bạn phải thêm const trong cả hai trường hợp, vì vậy tham chiếu rvalue chắc chắn được ưu tiên.

Những thứ như vậy nói chung là vô nghĩa - tốt nhất là để chúng ràng buộc với quá tải giá trị const. const rvalues ​​không có bất kỳ công dụng thực sự nào.

2 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ c++ c++11 lvalue rvalue overload-resolution , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading