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

Путаница по ключевому слову auto в С++

Меня смущает следующий фрагмент кода:

#include <iostream>
using namespace std;

int *foo()
{
   //Operation
}

int main ()
{
        auto int ret = foo();
}

Я скомпилировал вышеуказанный код под GCC, но получил следующую ошибку:

error: two or more data types in declaration of 'ret'
         auto int ret = foo();

Но, если я удаляю тип int, например:

auto ret = foo();

то он успешно выполняется.

auto является классом хранения и int является типом данных, а затем , почему я получаю ошибку "два или более типов данных", в первом случае?

4b9b3361

Ответ 1

auto не является классом хранения. Раньше это было до С++ 11. Но это было совершенно бесполезно, поэтому ключевое слово было переназначено для автоматического вывода типа. Поэтому, когда вы говорите:

auto int ret = foo();

В основном вы объявляете, что объект имеет 2 типа (или, возможно, один и тот же тип два раза), и это ошибка. И когда вы говорите:

auto ret = foo();

Тип ret определяется тем, что возвращает функция foo, которая в этом случае int*.

Ответ 2

auto - класс хранения

Это было верно перед С++ 11, но не более.

Начиная с С++ 11, значение слова было изменено. Теперь он используется для автоматического вывода типов. См. http://www.stroustrup.com/C++11FAQ.html#auto.

Почему в первом случае у меня возникла ошибка "два или более типов данных"?

Используя

auto int ret = foo();

вы пытаетесь указать два типа для ret - один выведен, а другой явно указан.

Если вы хотите использовать явно указанный тип, вы можете использовать:

int ret = *foo(); // Since foo() returns a pointer.

или

int* ret = foo();

или вы можете позволить компилятору вывести тип с помощью:

auto ret = foo();  

Ответ 3

auto НЕ является классом хранения (уже не с С++ 11). С++ 11 приводит ключевое слово, позволяющее компилятору сделать вывод о том, что является типом, который требуется для переменной, которую вы объявляете.

так что в основном выполнение auto int myVar недействительно как строка double myVar2 или bool long myVar3... переменная может иметь только одну тип данных, определяющий его, и в вашем случае ключевое слово auto делает это...

как избавиться от ошибки:

Удалите тип int и просто используйте авто, сделав так, чтобы компилятор был * AUTO ***, вывел этот тип переменной ** ret - это именно то, из чего возвращается foo():) просто гениальный!

auto ret = foo();

из doc:

Для переменных указывается, что тип переменной, которая объявленный автоматически будет выведен из его инициализатора. Для функции, указывает, что тип возвращаемого типа является возвращаемым типом возврата или будет выводиться из его возвращаемых операторов (начиная с С++ 14). для не-типа параметры шаблона, указывает, что тип будет выведен из Аргумент

Ответ 4

Вы написали, что:

auto - класс хранения

но это не более верно в С++ 11 (или позже). Ключевое слово auto было повторно использовано для чего-то совершенно другого (некоторый ограниченный тип вывода). Первый класс хранения С++ 03 или C99 auto теперь (в С++ 11) всегда неявный и не должен использовать ключевое слово auto.

(если вам нравится вывод типа, С++ 11 делает это не очень хорошо, но С++ 14 или С++ 17 продвинулись на нем, Ocaml имеет гораздо более мощный и интересный вывод типа Hindley-Milner, который является более "глобальным", поэтому я написал "некоторый ограниченный вид" )