2013-03-14 2 views
1

Мне интересно узнать об использовании ключевого слова auto в C++ 11.Определения функций C++ 11 с ключевым словом auto

для определения функции, вы должны написать возвращаемый тип функции:

auto f (int x) -> int { return x + 3; }; //success 
auto f (int x) { return x + 3; }; //fail 

, но в этом примере оба они будут работать:

auto f = [](int x) { return x + 3; }; //expect a failure but it works 
auto f = [](int x) -> int { return x + 3; }; // this is expected code 

спасибо.

+3

Просто специальные правила для лямбда, которые, скорее всего, будут применены к нормальным функциям/функциям шаблонов для C++ Далее, поэтому вторая функция из первого фрагмента будет компилироваться. – Xeo

ответ

5

В C++ 11 выражение лямбда может опускать свой возвращаемый тип, если он может выводить точный без двусмысленности. Однако это правило не применяется к регулярной функции.

int f() { return 0; } // a legal C++ function 

auto f() -> int { return 0; } // a legal C++ function only in C++11 

auto f() { return 0; } // an illegal C++ function even if in C++11 
+2

Обратите внимание, что это было предложено для следующей нормы (C++ 14), а GCC 4.8 уже реализует эту функцию с опцией '-std = C++ 1y'. – Morwenn

+0

@Morwenn спасибо. – iyasar

+0

Так что в принципе авто бесполезно для функций (так как вам нужно написать тип возврата в любом случае) правильно? –

0
  1. Если вам необходимо указать тип возвращаемого после «->» (как в C + 11) - то, что это точка, чтобы иметь «авто» в объявлении функции? Это как бы сказать: «Эта функция может что-то вернуть, но на самом деле это только этот тип». Э-э?

  2. Тогда, если вам не требуется указывать тип возвращаемого значения после «->» (как в C++ 14): представьте, что у вас нет исходного кода функции, но объектный файл и заголовок. Откуда вы знаете, что возвращает функция (тип возврата)?

До сих пор кажется, что «auto» в объявлении функции является еще одним способом записи нечитаемого кода. Как будто в C++ уже недостаточно способов сделать это.

Внутри тела функции «авто» является приятным «синтаксическим сахаром».

Или я что-то упускаю?

+0

(1) должно быть ключевое слово, чтобы вы могли четко указать объявление функции. Разбор C++ уже очень сложно реализовать. Они могли бы использовать новое ключевое слово, например «fun», но это могло бы привести к недействительности существующего кода, который использовал «fun» как переменную или имя типа. Поэтому они переработали существующее ключевое слово. – Ichthyo

+0

(2) вы можете опустить тип, если он может быть выведен компилятором. Это означает, что компилятор должен видеть тело функции, т. Е. Функция должна быть в заголовке в любом случае. Тип вывода, 'auto' и' decltype' позволяет вам писать вещи, которые невозможно определить иначе. Не для того, чтобы сэкономить вам написание. Если вы понимаете, какой читаемый код, то в чем проблема? просто сделайте это, напишите читаемый код. C++ предлагает вам множество вариантов, но это требует от вас дисциплинирования в выборе правильных средств для вашей цели – Ichthyo

Смежные вопросы