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

Тип возвращаемого типа функции

Я изучаю c++0x, по крайней мере, части, поддерживаемые бета-версией Visual С++ Express 2010. Это вопрос о стиле, а не о том, как он работает. Возможно, слишком рано для стиля и хорошей практики, чтобы развиться еще для стандарта, который еще не выпущен...

В c++0x вы можете определить тип возвращаемого метода, используя → type в конце функции, вместо того, чтобы вводить тип в начале. Я считаю, что это изменение синтаксиса требуется из-за lambdas и некоторых случаев использования нового ключевого слова decltype, но вы можете использовать его где угодно, насколько мне известно.

// Old style 
int add1(int a, int b)
{
 return a + b;
}

// New style return type
auto add2(int a, int b) -> int
{
 return a + b;
}

В моем случае действительно возникает вопрос, что некоторые функции нужно будет определить по-новому, считается ли он хорошим стилем для определения всех функций таким образом для согласованности? Или я должен придерживаться его только при необходимости?

4b9b3361

Ответ 1

Не соглашайтесь с тем, чтобы быть последовательным. Код должен быть читаемым, т.е. Понятным, что единственная реальная мера. Добавляя беспорядок к 95% методов, чтобы соответствовать другим 5%, ну, это просто не звучит правильно для меня.

Ответ 2

Существует огромная база кода, в которой используются "старые" /текущие правила. Я бы поспорил, что это будет так надолго. Проблема согласованности в два раза: с кем вы согласитесь, с несколькими кодами, для которых потребуется новый синтаксис или весь существующий код?

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

Также обратите внимание, что новый синтаксис все еще немного странный: вы объявляете возвращаемый тип как auto, а затем определяете, что означает auto в конце объявления подписи... Это не кажется естественным (даже если вы не сравниваете его со своим собственным опытом)

Ответ 3

Лично я буду использовать его, когда это необходимо. Точно так же, как this-> требуется только при доступе к членам шаблона базового класса (или когда они в противном случае скрыты), поэтому auto fn() -> type необходимо только тогда, когда тип возврата не может быть определен до того, как будет видна остальная часть сигнатуры функции.

Использование этого эмпирического правила, вероятно, поможет большинству читателей кода, которые могут подумать "почему автор подумал, что нам нужно написать декларацию таким образом?" в противном случае.

Ответ 4

Я не думаю, что его нужно использовать для регулярных функций. Он имеет специальное применение, позволяя вам легко делать то, что могло быть довольно неудобным раньше. Например:

template <class Container, class T>
auto find(Container& c, const T& t) -> decltype(c.begin());

Здесь мы не знаем, является ли Contain const или нет, поэтому будет ли тип возврата Container::iterator или Container::const_iterator (может быть определен из возвращаемого begin()).

Ответ 5

Мне кажется, что это изменило бы привычку к жизни для многих программистов на С++ (и других C).

Если вы использовали этот стиль для каждой отдельной функции, вы можете быть единственным, кто делает это: -)

Ответ 6

Я собираюсь догадаться, что нынешний стандарт победит, так как он до сих пор со всеми предлагаемыми изменениями в определении. Он был продлен, конечно, но существенная семантика С++ настолько сложна, что я не думаю, что они стоит изменить. Они повлияли на столь много языков и руководств стиля, что это смешно.

Что касается вашего вопроса, я бы попытался разделить код на модули, чтобы он дал понять, где вы используете старый стиль и новый стиль. Там, где две миксы, я бы удостоверился и разделил их как можно больше. Группируйте их вместе и т.д.

[личное мнение] Я нахожу, что это действительно раздражает, просматривая файлы и наблюдая за тем, как стиль перемещается вперед и назад или радикально меняется. Это просто заставляет меня задаться вопросом, что еще скрывается там [/личное мнение]

Ответ 7

Хорошие изменения стиля - если вы мне не верите, посмотрите на то, что было хорошим стилем в 98 году, и что сейчас - и трудно понять, что будет считаться хорошим стилем и почему. IMHO, в настоящее время все, что связано с С++ 0X, является экспериментальным, а качественный или плохой стиль просто не применяется.