C ++:const引用,类型说明符之前和之后


144

以下参数之间的区别是什么?

int foo1(const Fred &arg) {
...
}

int foo2(Fred const &arg) {
...
}

?我在parashift常见问题解答中看不到这种情况。



2
这是关于风格的问题吗?“ const Fred”在英语中听起来不错,但是“ Fred const”对我来说看起来更好。
LatinSuD 2010年

1
与此相关的,是没有任何理由应该更喜欢Fred const &argFred const& arg?我更喜欢后者,因为const&在那里有一个单位,表示“ constref”,并且名称arg与所有类型说明符之间用空格分隔。
弗兰克(Frank)2010年

4
@dehmann:但这int const& ref不是“ const ref”,而是“ ref const”。
Cedric H.

Answers:


112

相对于&而言,从右到左读取const 没什么区别,因此两者都表示对不变的Fred实例的引用。

Fred& const这将意味着引用本身是不可变的,这是多余的;当处理const指针时Fred const*和和Fred* const都是有效的,但有所不同。

这是一个样式问题,但是我更喜欢将其const用作后缀,因为它可以被一致地应用,包括const成员函数


那么要std::is_const<const T&>::value成为false什么呢?
深渊。

@ abyss.7是对const T; 的引用;引用是可变的。
肖恩·福塞特

125

行为

const T&和之间没有语义差异T const&;语言将它们视为相同类型。(同样的道理也适用于const T*T const*。)

作为风格问题

但是,关于在造型上您应该首选哪个,我将拒绝其他许多答案,并且更喜欢const T&(和const T*):

  • const T&是Stroustrup的《 C ++编程语言》一书中使用的样式。
  • const T& 是C ++标准本身使用的样式。
  • const T*是K&R的《 C编程语言》一书中使用的样式。
  • const T* 是C标准中使用的样式。
  • 由于上述因素,我认为const T&/ const T*具有比T const&/ 更多的惯性T const*const T&/从const T*经验上看,对我来说比T const&/ T const*在我所见过的所有C ++和C代码中更常见。我认为遵循常规做法比从原则上遵循从右到左的解析规则更具可读性。
  • 使用T const*,将*as 放错地方似乎更容易T* const(尤其是如果人们不习惯它)。相反,const* T不是合法的语法。

从右到左的解析规则呢?

关于人们似乎喜欢使用的从右到左的整个解析论点:正如我在另一个答案的评论中提到的那样,const T&从右到左也不错。它是对T常数的引用。“ T”和“ constant”都可以用作形容词或名词。(此外,读取T const*从右到左可以是不明确的,因为它可能被错误地解释为“指针常数 T”,而不是称为“指针恒定T”)。


3
+1,表示同意。读取代码时,如果该行以const开头,则更容易发现const。仅在手动分析特别是多毛的类型声明时,才真正需要左右规则。为什么不针对最常见的情况进行优化?此外,恕我直言,如果您编写类型声明,那么您需要在头脑中手动运行FSM,这是错误的。
Andreas Magnusson

2
-1。不管您的结论有多合理,我个人是否同意这些结论,他们都不会直接回答所提出的问题。这使得对一个简单问题的第二个答案似乎像是一些杂乱的水下机器的乱七八糟的东西,没有结论,没有直接答案-没什么。当您添加一个简单明了的摘要说明“ 不,两种语法之间没有语义上的区别,但是有一些样式上的注意事项,如下所示……”,您将得到我的认可。然后所有这些子弹。
ulidtko

1
IMO const T&读起来更好的原因是:1-我们从左到右阅读代码。2-当描述一个新概念时,我们从更一般的概念到更具体的概念开始。在此,const关键字更通用,因为它将变量空间分为两类,而类型说明符将其分为许多类。
pooya13

“指向”应该保持在一起。因此,对于T const*
Dexter,

13

尽管它们是相同的,但要保持与解析C和C ++声明有关的RIGHT-LEFT规则的一致性,最好编写Fred const &arg

另请参阅此内容,以进一步了解声明,限定符和声明符。


1
我更喜欢后缀,因为它在typedef扩展时效果更好。例如:typedef int* pointer;const pointer 不是 const int*,是int* const。后缀形式并不尴尬。
Matthieu M.

4
海事组织const T&从右到左阅读也不错。它是对T常数的引用。 T并且constant每一个都可以作为形容词或名词工作。
jamesdlin

7

两者都起作用,是写它的人的解释。
引用他的话:

为什么?当我发明“ const”(最初命名为“ readonly”,并具有一个对应的“ writeonly”)时,我允许它在类型之前或之后使用,因为我可以这样做而不会产生歧义。




3

引用的工作方式与指针不同:对于指针,您可以使用“常量指针”(type * const p)和“指向常量的指针”(const type * ptype const * p)。

但是您没有用于引用的内容:引用将始终引用同一对象;从这种意义上讲,您可以认为“引用”是“常量引用”(使用“常量指针”的方式相同)。

因此,“ type&const ref”之类的内容不合法。您只能具有“对类型的引用”(type &ref)和“对常量类型的引用”(const type &reftype const &ref;两者完全相同)。

最后一件事:即使用const type英语听起来听起来更正确,但编写仍type const可以使系统更系统地理解“从右到左”的声明:int const & ref可以读取“ ref是对常量int的引用”。或更复杂的示例:int const * const & ref,ref是指向常量int的常量指针的引用。

结论:在您的问题上,两者是完全相同的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.