Оператор подвійної адреси C ++? (&&)


137

Я читаю вихідний код STL і не маю уявлення, що &&повинен робити оператор адреси. Ось приклад коду з stl_vector.h:

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

Чи має "Адреса адреси" сенс? Чому у нього є два оператори адреси, а не один?


2
Можливо, це адресна довідка.
Гейб

1
@Gabe; це декларація, щоб вона стала посиланням на посилання, що не має жодного сенсу, оскільки саме посилання неможливо змінити. Адреса-адреса може використовуватися лише в коді, а не при оголошенні (параметр, як у цьому випадку, чи іншим чином). Ніколи не бачив нічого подібного, хоча.
falstro

5
Навіть якби був лише один &, це не матиме нічого спільного з адресою оператора, а натомість означає, що __xце посилання.
sepp2k

Відповіді:


112

Це код C ++ 11 . У C ++ 11 &&маркер може використовуватися для позначення "посилання на значення".


175

&&є новим у С ++ 11. int&& aозначає "a" - посилання на значення r. &&зазвичай використовується лише для оголошення параметра функції. І це бере лише вираз значення r. Якщо ви не знаєте, що таке r-значення, просте пояснення полягає в тому, що в ньому немає адреси пам'яті. Наприклад, число 6, а символ 'v' - обидва значення r. int a, a - l-значення, однак (a+2)є r-значенням. Наприклад:

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.
}

Сподіваюся, що це інформативно.


11
Єдиний приклад, який я хочу додати, - це, як це працює з std :: move. Показ того, що буде з int&& c = std::move( b );і т. Д.
Zzzach ...

2
Схоже, Sravani S відверто плагіат від вас на TutorialsPoint 15 лютого 2018 року тут .
Габріель Степлес

3
Я щойно надіслав TutorialsPoint це повідомлення . Стаття, як їх плагіат, виглядає приблизно так .
Габріель Степлес

86

&&є новим у C ++ 11, і це означає, що функція приймає RValue-Reference - тобто посилання на аргумент, який збирається знищити.


@bronekk: Ви бачили дату публікації у цьому повідомленні? Він не був опублікований станом на 28 грудня 2010 року.
Біллі ONeal

вибачте за це, видалено зараз. Будемо уважнішими наступного разу :)
bronekk

34

Як зазначалося в інших відповідях, &&маркер у цьому контексті є новим для C ++ 0x (наступний стандарт C ++) і являє собою "посилання на оцінку".

Посилання на Rvalue - одна з найважливіших новинок у майбутньому стандарті; вони дозволяють підтримувати семантику "переміщення" на об'єктах і дозволяють ідеально пересилати виклики функцій.

Це досить складна тема - одне з найкращих вступів (це не просто короткий досвід) - стаття Стефана Т. Лававей, "Довідники Rvalue: C ++ 0x Особливості в VC10, частина 2"

Зауважте, що стаття все ще досить важке для читання, але цілком варте того. І хоча це є в Microsoft VC ++ Blog, вся (або майже вся) інформація застосовна до будь-якого компілятора C ++ 0x.


Сама &&лексема не нова; його значення в деклараціях є. Але ти це знав.
aschepler

Це нове в цьому контексті. Але для C / C ++ вкрай традиційно перевантажувати свої маркери, щоб вони мали різний зміст у різних контекстах.
Мартін Йорк

1
@aschkleper - звичайно ... логічний оператор навіть не прийшов мені в голову. Я оновлю відповідь.
Майкл Берр

5

Я вважаю, що це оператор руху. operator=скажімо, оператор присвоєння vector x = vector y. Theclear()Виклик функції звучить так , як ніби він видаляє вміст вектора , щоб запобігти витоку пам'яті. Оператор повертає вказівник на новий вектор.

Сюди,

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

Навіть незважаючи на те, що ми давали вектору значення, вектор b має значення. Це магія operator=()!

MSDN - Як створити конструктор переміщення


1
Яку відповідь ви додаєте до цього 4-річного запитання, яке ще не було висвітлено в інших відповідях?
Людина в масках

5
Я не помітив такої відповіді, тому вирішив додати. Я натрапив на це питання, гуглюючи саме сьогодні.
yash101
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.