代码之家  ›  专栏  ›  技术社区  ›  Pod

强制转换和命名空间运算符之间没有空格?

  •  2
  • Pod  · 技术社区  · 14 年前

    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) 是::运算符的左操作数。

    *在cpp文件中也是一样的。

    3 回复  |  直到 14 年前
        1
  •  8
  •   CB Bailey    14 年前

    除了分隔令牌之外,在C++语法中,空白通常不重要。

    括号是有意义的,它们不能出现在 合格id 因此,以下两者之间不存在等价关系:

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

    AICargo::TownEffect::CargoSpec::Get
    

    第一种是两种 合格ID ,一个在括号中命名类型,另一个在括号中命名函数。在此上下文中,带圆括号类型的唯一有效解释是 投射表达式

        2
  •  1
  •   Matthieu M.    14 年前

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

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

    可能是因为 ( ) 不能是标识符的一部分。

        3
  •  1
  •   jemfinch    14 年前

    当查尔斯说一个句子中不能有括号时,他就在上面

    我想补充的是,在C++中,你不应该使用旧的C样式的样式作为样式。它们通常比你想要的更强壮并且被抛弃 const 而这往往不是你想要的。此外,它们实际上不可能在您的代码库中搜索,因此很难查看通常更容易导致bug的表达式。

    相反,在这种情况下,如果你真的需要一个C风格的强制转换的全部功能(忽略 你应该使用 reinterpret_cast<AICargo::TownEffect> static_cast 已经足够了。