C++ C++;:常量引用,在类型说明符之前和之后

C++ C++;:常量引用,在类型说明符之前和之后,c++,reference,constants,C++,Reference,Constants,下列参数之间的区别是什么: int foo1(const Fred &arg) { ... } 及 ?? 我看不到parashift常见问题解答中包含此案例。无差异,无差异 这两种方法都有效,这是作者的解释。 引用他的话: 为什么??当我发明“const”时 (最初命名为“只读”,并具有 对应的“writeonly”),我允许 它可以放在类型之前或之后 因为我可以不用担心 含糊不清 它们是一个相同的,为了保持与解析C和C++声明的规则的一致性,最好写弗莱德const & ARG< /C

下列参数之间的区别是什么:

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

?? 我看不到parashift常见问题解答中包含此案例。

无差异,

无差异 这两种方法都有效,这是作者的解释。
引用他的话:

为什么??当我发明“const”时 (最初命名为“只读”,并具有 对应的“writeonly”),我允许 它可以放在类型之前或之后 因为我可以不用担心 含糊不清


它们是一个相同的,为了保持与解析C和C++声明的规则的一致性,最好写<代码>弗莱德const & ARG< /COD> < /P> 另请参阅了解更多有关声明、限定符和声明器的信息。

因为const是相对于&从右向左读取的,所以两者都表示对不可变Fred实例的引用

Fred&const
意味着引用本身是不可变的,即:;处理
Fred*const*
Fred*const
时,两者都有效,但不同


这是一个风格问题,但我更喜欢使用
const
作为后缀,因为它可以被一致地应用,包括。

引用与指针的工作方式不同:对于指针,可以有“const pointers”(
type*const p
)和“pointer to const”(
const type*p
type const*p

但是你没有这样的引用:引用总是引用同一个对象;从这个意义上说,你可以认为“引用”是“const引用”(同样的方式,你可以有“const指针”)。 因此,“type&const ref”之类的内容是不合法的。只能有“引用类型”(
type&ref
)和“引用常量类型”(
const type&ref
type const&ref
;两者完全等效)

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

结论:在你的问题中,两者完全相同。

常量T&
常量T&
之间没有语义差异;语言将它们视为同一类型。(这同样适用于
const T*
T const*

就风格而言 但是,关于您应该在风格上更喜欢哪一种,我不同意许多其他答案,我更喜欢
const T&
(和
const T*
):

    <>代码> const t/<代码>是StruouStruts的C++编程语言书中使用的样式。 <>代码> const t/&代码>是C++标准本身使用的样式。
  • const T*
    是K&R的C编程语言书中使用的风格
  • const T*
    是C标准中使用的样式
  • 由于上述因素,我认为
    const T&
    /
    const T*
    T const&
    /
    T const*
    有更多的惯性<代码> const t/&代码> />代码> cont t*<代码>,在我所看到的所有C++和C代码中,经验似乎比 T const和 T const */COD>更常见。我认为,与教条式地遵循从右到左的解析规则相比,以下常见做法更具可读性
  • 使用
    T常量*
    ,似乎更容易将
    *
    错放为
    T*常量
    (特别是如果人们对它不太习惯的话)。相反,
    const*T
    不是合法语法
那么从右到左的解析规则呢?
关于人们似乎喜欢使用的整个从右到左的解析论点:正如我在对另一个答案的评论中所提到的,
const T&
从右到左也很好。这是对T常数的引用。“T”和“constant”都可以用作形容词或名词。(此外,从右向左读取
T const*
可能会产生歧义,因为它可能被错误地解释为“指向T的指针常量”,而不是“指向常量T的指针”)

这是关于样式的问题吗?“Fred const Fred”在英语中听起来不错,但在我看来“Fred const”更好。在一个相关的注释中,有什么理由人们应该更喜欢
Fred const&arg
而不是
Fred const&arg
?我更喜欢后者,因为
const&
是一个表示“constref”的单元,名称
arg
与所有类型说明符之间用空格分隔。@dehmann:但是
int const&ref
不是指“const ref”,而是指“ref to const”。重复:我更喜欢后缀,因为它在
typedef
扩展中工作得更好。示例:
typedef int*指针
const指针
不是
const int*
,而是
int*const
。后缀的形式并不笨拙。IMO
const T&
从右到左也很好;这是对T常数的引用
T
constant
都可以用作形容词或名词。在读取代码时,如果行以const开头,则更容易发现const。只有在手动解析特别复杂的类型声明时,才真正需要使用左右规则。为什么不针对最常见的情况进行优化?此外,如果你写类型声明,那么你需要在头脑中手动运行FSM,那么你就错了。不管你的结论有多合理,我个人有多同意,他们都没有直接回答问题。这使得一个简单问题的第二个答案看起来像是关于一些混乱的水下机械的离题胡言乱语,没有结论,没有直接的答案——什么都没有。当你加上一个简单明了的摘要说“不,没有se”时,你会得到我的支持
int foo2(Fred const &arg) {
...
}