Синтаксис стилей синтаксиса С++

Вопрос, связанный с Regular cast vs. static_cast vs. dynamic_cast:

Какой стиль синтаксиса вы предпочитаете в С++?

  • Синтаксис синтаксиса C-стиля: (int)foo
  • Синтаксис синтаксиса в стиле С++: static_cast<int>(foo)
  • синтаксис конструктора: int(foo)

Они могут не переводить точно такие же инструкции (они?), но их эффект должен быть одним и тем же (правильно?).

Если вы просто бросаете между встроенными числовыми типами, я нахожу синтаксис синтаксиса в стиле С++ слишком многословным. Как бывший Java-кодер, я предпочитаю использовать синтаксис синтаксиса C-стиля, но мой локальный гуру С++ настаивает на использовании синтаксиса конструктора.

Как вы думаете?

Ответ 1

Лучшей практикой никогда не использовать приведения в стиле C по трем основным причинам:

  • как уже упоминалось, проверка здесь не выполняется. Программист просто не может знать, какая из различных приведений используется, что ослабляет сильную типизацию.
  • новые броски намеренно визуально поражают. Поскольку броски часто обнаруживают слабость в коде, он утверждал, что делать заметки в коде - это хорошо.
  • Это особенно актуально, если поиск выполняется с помощью автоматизированного инструмента. Надежность наведения C-стиля надежно почти невозможна.

Как заметил palm3D:

Я нахожу синтаксис синтаксиса в стиле С++ слишком многословным.

Это намеренно по причинам, приведенным выше.

Синтаксис конструктора (официальное имя: приведение в стиле функции) семантически совпадает с приведением в стиле C и его следует избегать (кроме инициализаций переменных при объявлении) по тем же причинам. Дискуссивно, должно ли это быть истинным даже для типов, которые определяют пользовательские конструкторы, но в Effective С++, Майерс утверждает, что даже в тех случаях вы должны воздерживаться от их использования. Чтобы проиллюстрировать:

void f(auto_ptr<int> x);

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5));                // BAD

static_cast здесь фактически вызовет конструктор auto_ptr.

Ответ 2

Согласно Stroustrup:

Были введены "отливки нового стиля" дать программистам возможность заявить их намерения более четко и компилятор поймает больше ошибок.

И действительно, это для безопасности, поскольку это делает дополнительную проверку времени компиляции.

Ответ 3

Что касается этой темы, я следую рекомендациям Scott Meyers (Более эффективный С++, пункт 2: предпочтение С++-стиля).

Я согласен с тем, что приведение стилей в стиле С++ многословно, но что мне нравится в них: их очень легко обнаружить, и они упрощают чтение кода (что более важно, чем писать).

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

Ответ 4

Определенно С++ - стиль. Дополнительная наброска поможет вам избежать кастинга, если вы не должны: -)

Ответ 5

Синтаксис синтаксиса в стиле C, не проверяйте ошибку. Синтаксис синтаксиса С++, делает некоторые проверки. При использовании static_cast, даже если он не выполняет проверку, по крайней мере вы знаете, что вам следует быть осторожным здесь.

Ответ 6

C-стиль - самый худший путь. Сложнее видеть, неподдерживаемо, объединяет разные действия, которые не должны быть объединены, и не может делать все, что может сделать С++-стиль. Они действительно должны были удалить C-стиль приведения из языка.

Ответ 7

Я использую static_cast по двум причинам.

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

Ответ 8

В настоящее время мы используем C-стиль. Я задал другой вопрос вопрос о кастинге, и теперь я вижу преимущество использования static_cast вместо этого, если не по какой-либо другой причине, чем "greppable" (мне нравится этот термин). Я, вероятно, начну использовать это.

Мне не нравится стиль С++; он слишком похож на вызов функции.

Ответ 9

Перейдите к стилю С++, и, что еще хуже, уродливые подробные фрагменты кода, которые содержат явный тип вывода на С++, будут постоянным напоминанием о том, что мы все знаем (т.е. явное литье - плохое, что приводит к мошенничеству ругательств), Не используйте стиль С++, если хотите освоить искусство отслеживания ошибок времени выполнения.

Ответ 10

Синтаксис конструктора. С++ - OO, существуют конструкторы, я их использую. Если вы чувствуете необходимость аннотировать эти преобразования ctor, вы должны делать это для каждого типа, а не только из встроенных. Возможно, вы используете ключевое слово "явное" для конверсий, но синтаксис клиента имитирует то, что делает синтаксис ctor для встроенных типов. Будучи greppable, это может быть правдой, но что большой сюрприз в том, что ввод большего количества символов делает поиск простым. Зачем относиться к ним как к особым? Если вы пишете математические формулы с большим количеством int/unsigned/... до и из double/float - графики - и вам нужно писать static_cast каждый раз, внешний вид формулы становится загроможденным и очень нечитабельным. И это тяжелая битва в любом случае, как много раз вы будете конвертировать, даже не заметив, что вы есть. Для указателей downcasting я использую static_cast, так как по умолчанию не существует ctor, который бы это сделал.