При создании локальных переменных правильно использовать (const) auto&
или auto
?
например:
SomeClass object;
const auto result = object.SomeMethod();
или const auto& result = object.SomeMethod();
Где SomeMethod () возвращает непримитивное значение - возможно, другой определяемый пользователем тип. const auto& result
Насколько я понимаю, это правильно, поскольку результат, возвращаемый SomeMethod (), вызовет конструктор копирования для возвращаемого типа. Пожалуйста, поправьте меня, если я ошибаюсь.
А как насчет примитивных типов? Полагаю, const auto sum = 1 + 2;
это правильно.
Применимо ли это также к циклам на основе диапазона?
for(const auto& object : objects)
auto
работает (за исключением особого случаяinitializer_list
s, которые не выводится в контексте шаблона), затемauto
введите вывод.Ответы:
auto
иauto &&
охватывают большинство случаев:Используйте,
auto
когда вам нужна локальная копия. Это никогда не даст ссылки. Конструктор копирования (или перемещения) должен существовать, но он может не вызываться из-за оптимизации исключения копирования .Используйте,
auto &&
когда вам все равно, является ли объект локальным или нет. Технически это всегда будет создавать ссылку, но если инициализатор является временным (например, функция возвращается по значению), он будет вести себя по существу как ваш собственный локальный объект.Кроме того,
auto &&
это не гарантирует, что объект будет изменен. Учитываяconst
объект или ссылку, он сделает выводconst
. Однако, учитывая конкретный контекст, часто предполагается возможность модификации.auto &
иauto const &
более конкретны:auto &
гарантирует, что вы разделяете переменную с чем-то еще. Это всегда ссылка, а не временное.auto const &
похожеauto &&
, но предоставляет доступ только для чтения.Нет никакой разницы.
Да. Применяя вышеуказанные принципы,
auto &&
для возможности изменять и отбрасывать значения последовательности внутри цикла. (То есть, если контейнер не предоставляет представление только для чтения, напримерstd::initializer_list
, в этом случае он будет фактическиauto const &
.)auto &
для значимого изменения значений последовательности.auto const &
для доступа только для чтения.auto
для работы с (изменяемыми) копиями.Вы также упоминаете
auto const
без ссылки. Это работает, но не очень часто используется, потому что доступ только для чтения к тому, что у вас уже есть, редко дает преимущество.источник
auto&
, это хороший выбор. Но используется,const auto&
когда вы хотите добавить константности, которой еще нет.auto&&
предназначен для пересылки, что, я думаю, случается чаще, чем думает Саттер. Например, вы можете захотеть сохранить возвращаемое значение,auto&&
а затем «переслать» его двум вещам, например std :: cout, чтобы увидеть значение для отладки, а также передать его какой-либо другой функции. Раньше я чаще использовал auto &&, но меня укусило один или два раза, когда он делал какие-то неожиданные вещи. Хотел бы я больше обращать внимание на то, что пошло не так!auto&&
это связано с отсутствием языковой функции, которая должна позволить разделить любой оператор на более мелкие. Недостающая часть - продление срока службы… Я приложил немало усилий, чтобы исправить это, но никто этого не заметил. Не вкладывай слишком много денег в ученых мужей :)Да, правильно использовать
auto
иauto&
для локальных переменных. При получении возвращаемого типа функции его также можно использоватьauto&
. Это также относится к циклам на основе диапазона.Общие правила использования
auto
:auto x
когда вы хотите работать с копиями.auto &x
когда вы хотите работать с оригинальными элементами, и можете их изменять.auto const &x
когда вы хотите работать с исходными элементами и не будете их изменять.Вы можете узнать больше об автоспецификаторе здесь .
источник
auto
использует тот же механизм вывода типов, что и шаблоны, единственное известное мне исключение - это списки brace-init, которые выводятся с помощьюauto
asstd::initializer_list
, но не выводятся в контексте шаблона.auto x = expression;
работает, сначала удаляя все квалификаторы ссылки и cv из типа выражения правой части, а затем сопоставляя тип. Например, если у вас есть,
const int& f(){...}
тоauto x = f();
выводитx
какint
, а неconst int&
.Другая форма,
auto& x = expression
не удаляет cv-квалификаторы, поэтому, используя приведенный выше пример,
auto& x = f()
выводитx
какconst int&
. Остальные комбинации просто добавляют квалификаторы cv.Если вы хотите, чтобы ваш тип всегда выводился с помощью квалификаторов cv-ref, используйте печально известный
decltype(auto)
в C ++ 14, который используетdecltype
правила вывода типов.Итак, в двух словах, если вам нужны копии, используйте
auto
, если вам нужны ссылки, используйтеauto&
. Используйтеconst
всякий раз, когда вам нужна дополнительнаяconst
свобода.ИЗМЕНИТЬ Существует дополнительный вариант использования,
auto&& x = expression;
который использует правила сворачивания ссылок, как и в случае пересылки ссылок в коде шаблона. Если
expression
- lvalue, тоx
это ссылка на lvalue с квалификаторами cvexpression
. Еслиexpression
это rvalue, тоx
это ссылка на rvalue.источник
rvalues
. Есть ли простой способ тестирования? И как получить rvalue с квалификацией cv? При возврате функции cv отбрасывается.auto && x = std::move< const int >( 5 );
будет объявлятьint const && x
, хотя они редко используются.Да. Auto - это не что иное, как тип, выведенный компилятором, поэтому используйте ссылки там, где вы обычно используете ссылки, и локальные (автоматические) копии, где вы обычно используете локальные копии. Использование ссылки не зависит от вывода типа.
Юридический? Да, с константой. Лучшая практика? Наверное, нет. По крайней мере, не в C ++ 11. Особенно, если значение, возвращаемое SomeMethod (), уже является временным. Вы захотите узнать о семантике перемещения C ++ 11, исключении копирования и оптимизации возвращаемого значения: https://juanchopanzacpp.wordpress.com/2014/05/11/want-speed-dont-always-pass-by- значение/
http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=199
https://isocpp.org/wiki/faq/ctors#return-by-value-optimization
Да, это нормально.
Да, это тоже нормально. Я все время пишу такой код на работе.
источник