代码之家  ›  专栏  ›  技术社区  ›  Michael Aaron Safyan

为什么有些人更喜欢“T const&”而不是“const T&”?

  •  54
  • Michael Aaron Safyan  · 技术社区  · 14 年前

    所以,我意识到 const T& T const& 都是相同的,都表示对常量T的引用。在这两种情况下,引用也是常量(与指针不同,引用不能被重新分配)。在我有限的经验中,我观察到大多数C++程序员使用 常量(&A); ,但我遇到过一些使用 施工图; . 我用 施工图; 我觉得有点好笑。您使用变体的原因是什么?你们中有人在编码标准要求使用一种变体而不是另一种变体的组织工作吗?

    编辑
    根据答案,在这两者之间做出选择的一个原因似乎是,您是想像编译器一样阅读(从右到左)还是像英语一样阅读(从左到右)。如果像编译器一样读取它,那么“T const&读作“&(引用)const(常数)T(类型T)”。如果你读起来像英语,从左到右,那么“const T&读作“以引用的形式表示的T型常量对象”。我更喜欢像读英文散文一样读,但我可以肯定地看到用编译的方式来解释它的意义。

    没有人回答过组织或编码标准的问题,但我强烈怀疑,大多数组织并不要求一个标准优于另一个标准,尽管它们可能会努力保持一致性。

    8 回复  |  直到 14 年前
        1
  •  48
  •   UncleBens    14 年前

    我认为有些人只是喜欢从右到左阅读宣言。 const 适用于左手标记,除非那里没有任何东西,它适用于右手标记。因此 const T& 包含“除外”子句,可能会被认为更复杂(实际上两者都应该很容易理解)。

    比较:

    const T* p;  (pointer to T that is const)
    T const* p;  (pointer to const T) //<- arguable more natural to read
    T* const p;  (const pointer to T)
    
        2
  •  27
  •   Tomek    14 年前

    T const * const *p;
    

    意味着p是指向const的指针指向const T的指针,并且从右向左读。

    const T * const *p;
    

        3
  •  7
  •   Larry Engholm    14 年前

    如果你觉得这个讨论有趣,你可能会发现 this 丹萨克的文章很有趣。它没有直接解决你的问题,但解释了为什么他更喜欢

    VP const foo[];
    

    const VP foo[];
    

    这是因为

    typedef void *VP;
    

    你很容易被误导,以为上面的第二个例子意味着

    const void *foo[];  // Wrong, actually: void *const foo[];
    

    但第一个例子更难曲解。

        4
  •  5
  •   Edward Strange    14 年前

    我现在想不出任何例子,但我不止一次地回答了有关类型声明和常量的问题,其中问题是由使用“const t&而不是“T const&”。我以前也是这样写的,当我成为一名高级开发人员,负责指导和创建项目中的代码标准时,我发现当我强制每个人都使用“T const&时,入门级开发人员就容易多了。我想一个相当小的新手错误就是为什么要编译这个代码?

    
    const T* t = f();
    t = 0; // assignment to const?? - no, it is not the T* that is const, just the T.
    

    当您学习以编译器的方式来阅读它时,就更容易理解任何给定的复杂类型是什么,并且允许您在需要时更容易地声明复杂类型。对于复杂类型,我指的是:

    T常数*常数;

    
    T* ptr1 = 0, ptr2 = 0; // oops!!!
    
    

    // do it this way please! T* ptr1 = 0; T* ptr2 = 0;

    从技术上讲,这一切都是一样的,但当你试图让一群能力不同的人从事同一件事时,你会倾向于确保每个人都使用最容易理解和使用的方法。我的经验告诉我是那种方法。

        5
  •  4
  •   Cătălin Pitiș    14 年前

    我认为这是个人喜好。这两种变体没有区别。

        6
  •  3
  •   Corey    14 年前

    const T& 在编译器从右到左从内到外读取时,会自然地读取 T const& 自然阅读(参考常量)

        7
  •  1
  •   JRL    14 年前

    这是因为有些人觉得从右到左阅读声明很有帮助。

    char const*
    const char*
    

    都是指向const char的指针。

        8
  •  1
  •   Miral    6 年前

    我曾经是一个坚定的拥护者 const T& 因为它从逻辑上是从左到右读取的(这是一个 常数T 参考)(可能有一些偏见,因为我遇到的大多数代码都是这样写的。)

    对我来说,转折点是引入了 auto 在C++11中,尤其是与基于范围的for结合使用时。说到这里,我已经翻脸了,现在我非常喜欢 T const& ,这个总是在左边结束,我认为这样读起来更好。

    for (const T& a : list)         for (T& a : list)
    for (T const& a : list)         for (T& a : list)
    for (const auto& a : list)      for (auto& a : list)
    for (auto const& a : list)      for (auto& a : list)
    

    const 出现在T之后。

        9
  •  1
  •   greggo    5 年前

    如果 const &

    krog::FlamBlott<std::map<HurkleKey,Spleen<int>>
    speckleFlams( const krog::Floonage & floon, const std::map<krog::HackleSpoon,std::vector<krog::HeckleObservation<OBSN>>> & obsmap);
    
    krog::FlamFinagleReport
    finagleFlams( const krog::Floonage & floon, std::map<krog::HackleSpoon,std::vector<krog::HeckleObservation<OBSN>>> & obsmap)
    

    ... 然后很容易忽略第一个“obsmap”是常量引用,而第二个不是常量引用。