2010-03-15 2 views
12

Я изучаю c++0x, по крайней мере, части, поддерживаемые бета-версией Visual C++ 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; 
} 

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

+5

Бритва Оккама: для двух эквивалентных кодовых конструкций простейший вариант лучше всего. – 2010-03-15 08:24:21

+0

Btw, Visual Studio 2010 RC1 уже выпущен – abatishchev

+0

Да, это RC1 (экспресс), который я использую. Я ошибался в своей статье – jcoder

ответ

18

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

+0

Принял этот ответ, поскольку он подводит итог дискуссиям и в любом случае имеет самые высокие голоса. Другие ответы все хороши, хотя, спасибо – jcoder

2

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

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

5

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

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

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

2

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

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

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

5

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

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

1

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

5

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

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

Здесь мы не знаем, если Контейнер сопзЬ или нет, следовательно, является ли тип возврата будет Container::iterator или Container::const_iterator (может быть определена из того, что begin() вернется).

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