23

Một lập luận để chức năng này sẽ liên kết với một tài liệu tham khảo rvalue:Có sự khác biệt giữa tham chiếu phổ biến và tham chiếu chuyển tiếp không?

void f(int && i); 

Tuy nhiên, một cuộc tranh cãi với chức năng này sẽ liên kết với hoặc là một rvalue hoặc một tài liệu tham khảo giá trị trái:

template <typename T> 
void f(T && t); 

Tôi đã thường nghe điều này được gọi là một tham chiếu phổ quát.
Tôi cũng nghe nói nó được gọi là tham chiếu chuyển tiếp.
Chúng có nghĩa là giống nhau không?
Chỉ là tham chiếu chuyển tiếp nếu phần thân hàm gọi std::forward?

+1

Xem https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers đối với một số tài liệu cơ bản. –

+1

@SamVarshavchik Bạn có thực sự đọc câu hỏi hoặc blog đó không? – Barry

Trả lời

25

Họ có nghĩa là điều tương tự?

Universal reference là một thuật ngữ Scott Meyers đặt ra để mô tả các khái niệm về chụp một tài liệu tham khảo rvalue một mẫu tham số cv-không đủ tiêu chuẩn, mà sau đó có thể suy ra như hoặc là một giá trị hoặc một tài liệu tham khảo giá trị trái.

Vào thời điểm đó các tiêu chuẩn C++ không có một thuật ngữ đặc biệt cho việc này, đó là một sự giám sát trong C++ 11 và làm cho nó khó khăn để dạy. giám sát này đã được khắc phục bằng cách N4164, mà thêm vào định nghĩa sau đây để [temp.deduct]:

Tham chiếu chuyển tiếp là một tài liệu tham khảo rvalue đến một tham số mẫu cv-không đủ tiêu chuẩn. Nếu P là tham chiếu chuyển tiếp và đối số là một giá trị, loại "tham chiếu lvalue đến A" được sử dụng thay cho A để khấu trừ loại.

Do đó, hai có nghĩa là cùng một điều và cụm từ chuẩn C++ hiện tại là tham chiếu chuyển tiếp. Bản thân bài báo nêu rõ lý do tại sao "tham chiếu chuyển tiếp" là một thuật ngữ tốt hơn so với "tham chiếu chung".

Chỉ là tham chiếu chuyển tiếp nếu nội dung hàm gọi std::forward?

Không, bạn làm gì với tham chiếu chuyển tiếp không liên quan đến tên. Tham chiếu chuyển tiếp khái niệm chỉ đơn giản đề cập đến cách loại T được suy ra trong:

template <class T> void foo(T&&); // <== 

Nó không cần phải được chuyển tiếp sau đó.

+1

Câu trả lời hay! Bạn có bất kỳ ví dụ (không tầm thường), nơi bạn sẽ không gọi một 'std :: forward' trên tham chiếu chuyển tiếp không? Bạn cũng có thể đề cập đến trường hợp 'auto &&' cho các biến cục bộ. – vsoftco

+1

@vsoftco 'mẫu void foo (F && arg) {sử dụng (arg); use_again (arg); tiêu thụ (std :: forward (arg)); } ' – Barry

+0

Tự giải thích, cảm ơn, mặc dù bạn vẫn kết thúc với một chuyển tiếp :) – vsoftco

9

Thật không may, đó là khó hiểu, nhưng họ không có gì nhiều hơn hai tên cho cùng một điều.
tham khảo Phổ đã được đề xuất (tôi đoán) bởi Meyers xa trước (xem here là một ví dụ).
Forwarding tài liệu tham khảo được chọn trực tiếp từ standardese. Đó là tất cả.

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