Подтвердить что ты не робот

Если функция f() возвращает указатель, который является правильным: auto * v = f() ИЛИ auto v = f()?

Я использую ключевое слово С++ 11 auto почти везде. Я не уверен, правильно ли я использую его в этом случае. Рассмотрим следующий тривиальный пример: (http://ideone.com/TxLJlx)

#include <iostream>

const char* f()
{
    return "Hello";
}

int main()
{
    auto  s1 = f();
    auto* s2 = f();

    std::cout << s1 << std::endl;
    std::cout << s2 << std::endl;

    return 0;
}

Оба auto и auto*, похоже, работают и, похоже, делают то же самое. Это предположение неверно?

Почему оба дают одинаковые результаты?

Какое правильное использование auto в этом случае?

4b9b3361

Ответ 1

Оба они означают то же самое - тип будет const char* в обоих случаях. Однако, используя auto * подчеркивает (и самодокументы) тот факт, что f() возвращает указатель. И это будет сигнализировать об ошибке, если впоследствии функция будет изменена, чтобы вернуть что-то еще (например, std::string в этом случае).

Для использования в первую очередь это вопрос стиля. Если код в значительной степени зависит от f(), возвращающего указатель, или вы чувствуете необходимость сделать это очевидным, используйте auto*. В противном случае просто используйте auto и сделайте с ним.

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

Ответ 2

auto  s1 = f();

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

Ответ 3

auto завершает любой тип, если вы указали указатель (*), все его левые должны заполнить char (или вызовет ошибку, если завершение не будет доступно, например, если f() возвращает обычный char).

Вы должны потрудиться с указателем, просто используйте auto.