Нет пробела между приведением и оператором пространства имен? - PullRequest
2 голосов
/ 08 апреля 2010

Может ли кто-нибудь объяснить следующую строку кода, найденную на http://docs.openttd.org/ai__cargo_8cpp_source.html

return (AICargo::TownEffect)::CargoSpec::Get(cargo_type)->town_effect;

Если эта строка была:

return (AICargo::TownEffect) ::CargoSpec::Get(cargo_type)->town_effect;

(обратите внимание на пробел между TownEffect) и::) тогда я бы понял это нормально.Однако в этом документе нет пробелов, что означает, что (AICargo::TownEffect) является левым операндом оператора ::.

Как этот код работает / компилируется?Или две вещи эквивалентны из-за неясного правила C ++?

* То же самое и в файле cpp.

Ответы [ 3 ]

8 голосов
/ 08 апреля 2010

За исключением разделения токенов, пробел обычно не имеет значения в грамматике C ++.

Круглые скобки имеют значение, и они не могут появляться в qualid-id , поэтому нет эквивалентностимежду:

(AICargo::TownEffect)::CargoSpec::Get

и

AICargo::TownEffect::CargoSpec::Get

В первом есть два квалифицированных идентификатора , один в скобках, обозначающий тип, а другой - функцию.Единственная допустимая интерпретация заключенного в скобки типа в этом контексте - это cast-expression .Есть ли пробел после закрывающей скобки, без разницы.

1 голос
/ 08 апреля 2010

Чарльз прямо выше, когда говорит, что в квалифицированном идентификаторе .

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

Вместо этого, в этом случае, если вам действительно требуется полная мощностьПриведение в стиле C (без учета const ness в данный момент), вы должны использовать reinterpret_cast<AICargo::TownEffect>.Однако, не глядя на код, меня не удивило бы, если бы static_cast было достаточно.

1 голос
/ 08 апреля 2010

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

Это не более нечитаемо, что:

if(cargo_type){return cargo_type->town_effect;}

Вероятно, это связано с тем, что ( и ) не могут быть частью идентификатора.

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