Что означает переменная, названная с помощью амперсанда и знака подчеркивания? - PullRequest
0 голосов
/ 19 июня 2019

Я изучаю C ++ и обнаружил этот странный синтаксис. Что означает &_ и почему автор может использовать переменную как _1st?

std::sort(open_list.begin(), open_list.end(), [] (const auto &_1st, const auto &_2st) {
  return _1st->h_value + _1st->g_value < _2st->h_value + _2st->g_value
});

РЕДАКТИРОВАТЬ 1

Я подумал, что для создания ссылки на переменную необходимо использовать оператор амперсанда, за которым следует имя, например: & _1st (обратите внимание на пробел между ними). ​​

Подчеркивает ли это особый способ объявления именных переменных в C ++?

Ответы [ 5 ]

8 голосов
/ 19 июня 2019

& используется для объявления ссылок;поэтому const auto &_1st объявляет параметр с именем _1st, тип которого является lvalue-reference (to const).Это то же самое, что и const auto & _1st, а пробелы лишние ;Вы даже можете написать это как const auto&_1st, это не специально для подчеркивания.

И обратите внимание, что подчеркивания могут использоваться для идентификаторов .

An идентификатор - это произвольно длинная последовательность цифр, подчеркивания, строчных и прописных латинских букв и большинства символов Юникода (подробности см. Ниже).Допустимый идентификатор должен начинаться с нецифрового символа (латинского алфавита, подчеркивания или нецифрового символа Unicode).

3 голосов
/ 19 июня 2019

Переменные могут использоваться только в соответствии с определенными правилами. Он не может напрямую начинаться с цифры, поэтому автор использовал _ (подчеркивание). Посмотрите на это: https://www.sitesbay.com/cpp/cpp-variable-declaration

Символ амперсанда используется для обозначения передачи по ссылке.

3 голосов
/ 19 июня 2019

const auto &_1st

Это объявляет параметр с именем _1st. & означает, что он передается по ссылке на функцию.

1 голос
/ 19 июня 2019

Операция: & + имя переменной , а не &_ + имя переменной .

В этом контексте &, за которым следует переменная, означаетпередача указателя на эту переменную в качестве одного из аргументов функции.Вы, вероятно, заметите, что в вставленном вами коде третий очень длинный аргумент std::sort на самом деле является лямбда-выражением (функцией):

[] (const auto &_1st, const auto &_2st) {
  return _1st->h_value + _1st->g_value < _2st->h_value + _2st->g_value
}

Он соответствует третьему аргументу sort изсогласно ЗДЕСЬ , ниже приведена краткая цитата:

comp

Двоичная функция, которая принимает два элемента в диапазоне в качестве аргументов и возвращает значение, преобразуемоекипетьВозвращаемое значение указывает, считается ли элемент, переданный в качестве первого аргумента, перед вторым в определенном строгом слабом порядке, который он определяет.Функция не должна изменять ни один из своих аргументов.Это может быть либо указатель на функцию, либо функциональный объект.

Так что, в основном, когда вы хотите отсортировать тип переменной по вашему определенному правилу, или c ++ не знает, как сравнивать цель, которую вы пытаетесьдля сортировки необходимо определить функцию, которая сообщает c ++, как выполнять сортировку.

Для получения дополнительной информации вы также можете взглянуть на THIS .

.несколько причин для передачи переменных в качестве ссылочных указателей вместо передачи по значению.Во многих случаях вы просто не хотели создавать дополнительное потребление памяти и экономить время, передавая по ссылке, вы получаете доступ к значениям без создания копии.Подробнее см. ЗДЕСЬ

0 голосов
/ 19 июня 2019

Это просто соглашение об именах для объявления переменной, записанной кем-то в этом фрагменте кода.

Итак, _1st и _2nd просто ссылочная переменная типа auto.

Ниже код также будет работать нормально:

std::sort(open_list.begin(), open_list.end(), [] (const auto &first, const auto &second) {
return first->h_value + first->g_value < second->h_value + second->g_value
});
...