kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
James Leonard
James Leonard
Вопрос

decltype против auto

Как я понимаю, и decltype, и auto будут пытаться определить тип чего-либо.

Если мы определим:

int foo () {
    return 34;
}

Тогда оба объявления законны:

auto x = foo();
cout << x << endl;

decltype(foo()) y = 13;
cout << y << endl;

Подскажите, пожалуйста, в чем основное различие между decltype и auto?

43 2012-08-23T02:41:24+00:00 3
 ForceBru
ForceBru
Редактировал вопрос 20-го февраля 2016 в 5:21
Программирование
c++
type-inference
Решение / Ответ
 Mankarse
Mankarse
23-го августа 2012 в 2:53
2012-08-23T02:53:25+00:00
Дополнительно
Источник
Редактировать
#17021942

decltype выдает заявленный тип выражения, которое ему передается. auto делает то же самое, что и вычитание типа шаблона. Так, например, если у вас есть функция, которая возвращает ссылку, auto все еще будет значением (вам нужно auto&, чтобы получить ссылку), но decltype будет точно соответствовать типу возвращаемого значения.

#include <iostream>
int global{};
int& foo()
{
   return global;
}

int main()
{
    decltype(foo()) a = foo(); //a is an `int&`
    auto b = foo(); //b is an `int`
    b = 2;

    std::cout << "a: " << a << '\n'; //prints "a: 0"
    std::cout << "b: " << b << '\n'; //prints "b: 2"

    std::cout << "---\n";
    decltype(foo()) c = foo(); //c is an `int&`
    c = 10;

    std::cout << "a: " << a << '\n'; //prints "a: 10"
    std::cout << "b: " << b << '\n'; //prints "b: 2"
    std::cout << "c: " << c << '\n'; //prints "c: 10"
 }

Также смотрите ответ David Rodríguez'а о местах, в которых возможен только один из auto или decltype.

 Mankarse
Mankarse
Редактировал ответ 6-го сентября 2013 в 11:49
43
0
David  Rodr&#237;guez - dribeas
David Rodríguez - dribeas
23-го августа 2012 в 2:55
2012-08-23T02:55:18+00:00
Дополнительно
Источник
Редактировать
#17021943

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

В тех случаях, когда можно использовать auto, она более лаконична, чем decltype, так как вам не нужно предоставлять выражение, из которого будет выведен тип.

auto x = foo();                           // more concise than `decltype(foo()) x`
std::vector<decltype(foo())> v{ foo() };  // cannot use `auto`

Ключевое слово auto также используется в совершенно несвязанном контексте, при использовании трейлинг возвращаемых типов для функций:

auto foo() -> int;

Здесь auto является ведущим только для того, чтобы компилятор знал, что это объявление с трейлинговым типом возврата. Хотя приведенный выше пример можно тривиально преобразовать к старому стилю, в общем программировании он полезен:

template <typename T, typename U>
auto sum( T t, U u ) -> decltype(t+u)

Обратите внимание, что в этом случае auto не может быть использовано для определения возвращаемого типа.

35
0
 Ankur
Ankur
7-го июля 2016 в 12:13
2016-07-07T12:13:42+00:00
Дополнительно
Источник
Редактировать
#17021944

Обычно, если вам нужен тип для переменной, которую вы собираетесь инициализировать, используйте auto. decltype лучше использовать, когда вам нужен тип для чего-то, что не является переменной, например, для возвращаемого типа.

0
0
Похожие сообщества 9
pro.cxx
pro.cxx
5 960 пользователей
C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. No Ads, offtop, flood 2. Полные правила тут https://t.me/ProCxx/259155 Объявления о вакансиях,эвентах - в лс @AlexFails или @MasterZiV
Открыть telegram
supapro.cxx
supapro.cxx
4 991 пользователей
Чат для тех, кто немного знает C++, простые вопросы по C++, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат-флудилка — @fludpac /прогерские вопросы – @pro_prog 🚫flood, pron, spam; ✅УВАЖАЙТЕ ДРУГ ДРУГА!
Открыть telegram
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
1 393 пользователей
Лекции: www.youtube.com/playlist?list=PLRDzFCPr95fL_5Xvnufpwj2uYZnZBBnsr Практика: cs.mipt.ru/cpp_algo Спонсировать: www.paypal.me/tkhirianov Онлайн компилятор https://godbolt.org
Открыть telegram
Чат конференции C++ Russia
Чат конференции C++ Russia
1 205 пользователей
Канал конференции: @cpprussia_channel Ближайшая конференция — C++ Russia 2023, 11–12 мая · Online Оффлайн — 23–24 мая · Москва Билеты: https://tinyurl.com/CPPRussia2023 Саппорт: @JUGConfSupport_bot
Открыть telegram
Android NDK (C++) — русскоговорящее сообщество
Android NDK (C++) — русскоговорящее сообщество
783 пользователей
Общаемся на темы, посвященным Android-разработке на C++. Обмен новостями, опытом и наработками. + Про Android: @android_ru + Про iOS: @ios_ru + Канал Android: @pandroidtoday_ru + Вакансии: @mobile_jobs Рекомендуем отключить уведомления.
Открыть telegram
C++ для самых маленьких и отчаяных
C++ для самых маленьких и отчаяных
564 пользователей
Лоу левел (по среднему IQ участников) чатик По продвижению вакансий писать @vertver Флудилка чата - @hckcxx
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 2 дня назад
2
Денис Васьков
Зарегистрирован 4 дня назад
3
Dima Patrushev
Зарегистрирован 6 дней назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией