Trong cả hai cuộc gọi chức năng, những gì bạn chuyển đến hàm là int &
(theo nghĩa: "giá trị của loại int
"). Vì vậy, được trình bày với tuyên bố của inc1
, trình biên dịch phải khấu trừ T
sao cho T &&
khớp với đối số bạn đã cung cấp, tức là int &
. Cách duy nhất để làm điều này là giả định rằng T
là int &
, bởi vì sau đó T &&
là int & &&
, tương đương với int &
. Vì vậy, T
trở thành int &
và địa phương y
được khai báo là như vậy.
Mặt khác, trong inc2
, trình biên dịch phải suy T
mà T &
trận đấu kiểu lập luận mà bạn cung cấp, mà vẫn còn int &
. Điều đó được thực hiện dễ dàng nhất bằng cách giả sử T
chỉ đơn giản là int
, do đó, đó là những gì bạn nhận được cho loại địa phương y
sau đó.
Trả lời một vài ý kiến (đã đồng thời bị xóa): Nếu bạn có một chức năng với một kiểu lập luận xác định trước, chẳng hạn như
sau đó, khi bạn gọi đây là ví dụ như inc3(a)
, trình biên dịch sẽ áp dụng bất kỳ chuyển đổi ngầm nào cần thiết thành đối số để làm cho nó phù hợp. Trong trường hợp của inc3(a)
, điều này có nghĩa là chuyển đổi a
từ int &
(theo nghĩa của lvalue) sang int
(theo nghĩa rvalue) – được gọi là chuyển đổi lvalue thành rvalue và chuyển đổi tiềm ẩn hợp lệ. Về cơ bản nó là số tiền để biến biến a
thành giá trị mà nó đại diện tại thời điểm đó.
Nhưng khi bạn khai báo một mẫu, chẳng hạn như inc1
và inc2
từ câu hỏi, và đối số chức năng được xác định trong điều khoản của một số mẫu, sau đó trình biên dịch sẽ không, hay không mà thôi, cố gắng áp dụng chuyển đổi tiềm ẩn đối số để làm cho nó phù hợp.Thay vào đó, nó sẽ chọn thông số loại đối số T
để nó khớp với loại đối số bạn đã cung cấp. Các quy tắc cho điều này phức tạp, nhưng trong trường hợp khai báo đối số loại T &&
, chúng hoạt động như mô tả ở trên. (Trong trường hợp của một tuyên bố T
tranh luận thuần túy, một cuộc tranh cãi giá trị trái vẫn sẽ trải qua vế trái-to-rvalue chuyển đổi, và T
sẽ được suy luận như int
, không int &
.)
Đây là lý do tại sao, trong khi int &&
là một tài liệu tham khảo rvalue , T &&
(trong đó T
là thông số mẫu) không nhất thiết phải là tham chiếu giá trị. Thay vào đó, đó là bất kỳ kết quả nào từ việc lắp T
vào đối số được cung cấp. Do đó, biểu thức T &&
trong trường hợp này được gọi là tham chiếu chung (như được đối chiếu với tham chiếu giá trị hoặc giá trị) – nó là tham chiếu trở thành giá trị hoặc giá trị, nếu cần.
Tại sao bạn nói chúng tôi chuyển 'int &'? Điều này có hiển nhiên không? – perreal
@perreal Có. Các đối số được truyền là các biến được khai báo là 'int':' int a = 10; 'và' int b = 10; ', tương ứng. Khi các biến như vậy được sử dụng làm đối số cho các cuộc gọi hàm, kiểu của chúng là 'int &' (tức là chúng là tham chiếu lvalue). – jogojapan
Để sửa chú thích trước của tôi: Kiểu của các biến này thực sự là 'int &', vì vậy chúng là _lvalues_ (không phải tham chiếu lvalue. Thuật ngữ này chỉ áp dụng cho các biến mới được khai báo là tham chiếu đến 'a' hoặc' b'). – jogojapan