演员和命名空间操作符之间没有空格?

时间:2010-04-08 12:34:33

标签: c++ namespaces

有人可以解释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 个答案:

答案 0 :(得分:8)

除了分隔标记之外,C ++语法中的空格通常不重要。

括号很重要,它们不能出现在 qualified-id 中,因此不存在等价:

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

AICargo::TownEffect::CargoSpec::Get

在第一个中有两个 qualified-ids ,一个在括号中,命名一个类型,另一个命名一个函数。在此上下文中对括号类型的唯一有效解释是 cast-expression 。在右括号后是否有空格没有区别。

答案 1 :(得分:1)

这是一个简单的解析问题:这里不需要空格,因为我们知道C样式的转换以括号结束。

这不再是不可读的:

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

这可能源于()不能成为标识符的一部分。

答案 2 :(得分:1)

当Charles说 qualified-id 中没有括号时,Charles就在上方。

我想在C ++中添加它,你不应该使用旧的C风格的转换作为一种风格问题。他们通常比你想要的更强大,并抛弃了const,这通常不是你想要的。此外,它们实际上无法搜索您的代码库,因此很难查看通常更有可能导致错误的表达式。

相反,在这种情况下,如果你真的需要C风格演员的全部力量(目前无视const),你应该使用reinterpret_cast<AICargo::TownEffect>。但是,如果static_cast足够,我不会看代码。