Toán tử kép C ++? (&&)


137

Tôi đang đọc mã nguồn STL và tôi không biết &&nhà điều hành địa chỉ nào phải làm. Đây là một ví dụ mã từ stl_vector.h:

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}

"Địa chỉ địa chỉ" có ý nghĩa gì không? Tại sao nó có hai toán tử địa chỉ thay vì chỉ một?


2
Có lẽ đó là một địa chỉ của một tài liệu tham khảo.
Gabe

1
@Gabe; đó là một tuyên bố vì vậy sẽ làm cho nó trở thành một tham chiếu đến một tham chiếu, điều này không có ý nghĩa gì vì chính tham chiếu đó không thể được sửa đổi. Địa chỉ của chỉ có thể được sử dụng trong mã, không phải khi khai báo (một tham số như trong trường hợp này, hoặc nếu không). Không bao giờ nhìn thấy bất cứ điều gì như thế này mặc dù.
falstro

5
Ngay cả khi chỉ có một &, nó sẽ không liên quan gì đến địa chỉ của nhà điều hành, nhưng thay vào đó, nó có nghĩa __xlà một tài liệu tham khảo.
sepp2k

Câu trả lời:


112

Đây là mã C ++ 11 . Trong C ++ 11, &&mã thông báo có thể được sử dụng để có nghĩa là "tham chiếu giá trị".


174

&&là mới trong C ++ 11. int&& acó nghĩa là "a" là một tham chiếu giá trị r. &&thường chỉ được sử dụng để khai báo một tham số của hàm. Và nó chỉ mất một biểu thức giá trị r. Nếu bạn không biết giá trị r là gì, thì lời giải thích đơn giản là nó không có địa chỉ bộ nhớ. Ví dụ: số 6 và ký tự 'v' đều là giá trị r. int a, a là giá trị l, tuy nhiên (a+2)là giá trị r. Ví dụ:

void foo(int&& a)
{
    //Some magical code...
}

int main()
{
    int b;
    foo(b); //Error. An rValue reference cannot be pointed to a lValue.
    foo(5); //Compiles with no error.
    foo(b+3); //Compiles with no error.

    int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
    int&& d = 5; //Compiles with no error.
}

Hy vọng đó là thông tin.


11
Ví dụ duy nhất tôi muốn bạn thêm là cách nó hoạt động với std :: move. Hiển thị những gì sẽ xảy ra với int&& c = std::move( b );, v.v.
Zzzach ...

2
Có vẻ như Sravani S ngang nhiên đạo văn từ bạn cho TutorialsPoint vào ngày 15 tháng 2 năm 2018, tại đây .
Gabriel Staples

3
Tôi vừa gửi Hướng dẫn Điểm tin nhắn này . Bài báo, như đạo văn của họ, trông như thế này .
Gabriel Staples

86

&&là tính năng mới trong C ++ 11 và nó biểu thị rằng hàm chấp nhận RValue-Reference - nghĩa là tham chiếu đến một đối số sắp bị hủy.


@bronekk: Bạn có thấy ngày đăng bài trên tin nhắn này không? Nó không được xuất bản vào ngày 28 tháng 12 năm 2010
Billy ONeal

xin lỗi về điều đó, loại bỏ ngay bây giờ Lần sau sẽ cẩn thận hơn :)
bronekk

34

Như các câu trả lời khác đã đề cập, &&mã thông báo trong ngữ cảnh này là mới đối với C ++ 0x (tiêu chuẩn C ++ tiếp theo) và đại diện cho một "tham chiếu giá trị".

Tài liệu tham khảo Rvalue là một trong những điều mới quan trọng hơn trong tiêu chuẩn sắp tới; chúng cho phép hỗ trợ cho ngữ nghĩa 'di chuyển' trên các đối tượng và cho phép chuyển tiếp hoàn hảo các lệnh gọi hàm.

Đây là một chủ đề khá phức tạp - một trong những lời giới thiệu hay nhất (không chỉ đơn thuần là chữ thảo) là một bài viết của Stephan T. Lavavej, "Tài liệu tham khảo Rvalue: Các tính năng của C ++ 0x trong VC10, Phần 2"

Lưu ý rằng bài viết vẫn còn khá nặng đọc, nhưng cũng đáng giá. Và mặc dù trên Blog Microsoft VC ++, tất cả (hoặc gần như tất cả) thông tin đều có thể áp dụng cho bất kỳ trình biên dịch C ++ 0x nào.


Bản &&thân mã thông báo không phải là mới; ý nghĩa của nó trong khai báo là. Nhưng bạn biết điều đó.
aschepler

Nó mới trong bối cảnh này. Nhưng nó rất truyền thống đối với C / C ++ khi quá tải mã thông báo của nó để có ý nghĩa khác nhau trong các bối cảnh khác nhau.
Martin York

1
@aschkleper - tất nhiên ... logic và toán tử thậm chí không đi vào tâm trí của tôi. Tôi sẽ cập nhật câu trả lời.
Michael Burr

5

Tôi tin rằng đó là một nhà điều hành di chuyển. operator=là toán tử gán, nói vector x = vector y. Các clear()cuộc gọi chức năng có vẻ như là nếu nó được xóa các nội dung của vector để ngăn chặn rò rỉ bộ nhớ. Toán tử trả về một con trỏ tới vector mới.

Cách này,

std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
    std::cout << b[i] << ' ';
}

Mặc dù chúng ta đã cho vector một giá trị, vector b có các giá trị. Đó là sự kỳ diệu của operator=()!

MSDN - Cách tạo một hàm tạo di chuyển


1
Câu trả lời của bạn thêm vào câu hỏi 4 tuổi này là gì mà chưa được đề cập trong các câu trả lời khác?
Người đàn ông đeo mặt nạ

5
Tôi đã không nhận thấy bất kỳ câu trả lời như thế này vì vậy tôi quyết định thêm vào. Tôi đã đi qua câu hỏi này bằng cách googling chỉ ngày hôm nay.
yash101
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.