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

Я использую ключевое слово c++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 в данном случае?


person x-x    schedule 01.01.2014    source источник
comment
Я думаю, что эта статья может вам помочь.   -  person hyun    schedule 01.01.2014


Ответы (3)


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

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

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

person Angew is no longer proud of SO    schedule 01.01.2014
comment
Или, в случае ссылок, decltype(auto) - person TemplateRex; 01.01.2014

auto  s1 = f();

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

person Alok Save    schedule 01.01.2014
comment
Я не знаю!! Это правда и в C? - person Grijesh Chauhan; 01.01.2014
comment
@GrjeshChauhan: OP означает ключевое слово auto в C++11, не имеющее ничего общего с C. - person Alok Save; 01.01.2014
comment
Да, но это мой вопрос к вам .. хотя я попробую, спасибо! - person Grijesh Chauhan; 01.01.2014
comment
@GrijeshChauhan: C и C++ имеют разные стандарты, поэтому я не уверен, как можно применить конструкцию C++ к C, ведь это разные языки. - person Alok Save; 01.01.2014

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

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

person Vladp    schedule 01.01.2014