“ const引用”实际上不应该称为“对const的引用”吗?

时间:2019-10-27 13:42:35

标签: c++ pointers language-lawyer constexpr

在使用constexpr引用时,我想到了这种感觉。但是问题本身与constexpr无关,只是由它揭示出来。

我们知道存在“指向const的指针”和“指向const的指针”。顺便说一句,由于后者的用法要比前者少得多,因此实际上通常使用它们的名称来引用前者。无论如何,对于引用没有这种区别,因为它们不可重新绑定。因此,我们只有“ const引用”,而没有“ const引用”。这是通用术语,在标准中也是is used。但这对我来说似乎不对。

让我们看一些众所周知的示例,并用以下通用术语进行评论:

      int    i = 0;   // Value
      int*  pi = &i;  // Pointer to i
const int* cpi = &i;  // Pointer to const i
int const* cpi = &i;  // Pointer to const i (east-const style)
int* const pci = &i;  // Const pointer to i
      int&  ri = i;   // Reference to i
const int& rci = i;   // Const reference to i
int const& rci = i;   // Const reference to i (east-const style)

现在让我们仔细看一下上面的几行:

const int* cpi = &i;  // Pointer to const i
const int& rci = i;   // Const reference to i

const int*声明“ const指针”,而const int&声明“ const引用”。声明中的顺序相同,含义不同。这里显然有矛盾之处。但是,如果我们称其为“对const的引用”,那么不一致就消失了。双方的顺序相同。

constexpr的引入加剧了紧张气氛:

constexpr int& cri = i;  // Constexpr reference to i
constexpr const int& crci = i;  // Constexpr const reference to i

“ Constexpr const”参考? ??文档clearly says

  

对象声明中使用的constexpr修饰符表示const

引用是一个对象。那么为什么const已经是constepxr的时候又需要i呢?。如果crci是常量,我们仍然需要它。看起来很沮丧。

但是在“引用const”的帮助下,不再沮丧。让我们将const称为“对const i的constexpr引用”。现在很明显,constexpr应用于引用的对象,而const int& constexpr crci = i; // Constexpr reference to const i const int* const pci = &i; // Const pointer to const i (perfect consistency) 应用于引用本身,说明了它可以在constexpr上下文中使用的事实。而且它是const,因为所有引用都是const。很有道理。为了使其与指针更加一致,我们甚至可能使用了以下假设语法:

sed -i "" -e "s/,omitempty//g" ./api/proto/*.go

但这不是C ++的工作原理,无论好坏,都是如此。

这种“引用const”的概念确实帮助我理解了“ constexpr const reference”。

您怎么看? “引用const”的概念听起来令人信服吗?

2 个答案:

答案 0 :(得分:2)

由于volatile往往也很相关,因此标准经常在规范性文本中使用“对cv-(un)限定的引用”来覆盖这两个限定符,这符合您的偏好。

通过快速搜索,除了您引用的代码示例外,该标准似乎还在以下位置使用(非)const引用,所有这些都在标准库规范中:

  

[container.node.observers]

key_type& key() const;
     

返回:对...的非常量引用

     
     

[rand.req.adapt]

     

...表达式a.base()应该有效,并且应返回const引用...

     
     

[futures.shared.future

     

—(19.1)shared_future :: get()返回对...的常量引用。

可以说,通过引用const可以改善措辞。


在标准之外,使用“对const的引用” 。但是const引用也是如此,有时可能由于简洁而选择。

实际上,指向const的指针在俗称上也经常称为const指针,即使含义不明确也很容易引起混淆。对于引用,对于那些知道引用不能是顶级资格的人来说,没有任何歧义。初学者不会知道,因此在我看来,在介绍材料中使用“引用const”很重要。但是也许解释也是如此,因为const引用用于表示同一件事。

答案 1 :(得分:2)

是的,const int &的专有名称是“对const int的引用”。

它通常被称为“对const的“ int引用”(可能是因为它对某些人来说听起来更好),但是从技术上讲,这是个错误的称呼。

即使引用不可重新绑定,引用本身也不会const(即,std::is_const_v始终等于false作为引用)。


constexpr const int& crci 
     

“ Constexpr const”参考? ?? ...让我们称之为crci“对const i的constexpr引用”

是的,crci是“对const i的constexpr引用”。


  

为使其与指针更加一致,我们甚至可能使用以下假设语法:

const int& constexpr crci = i;   // Constexpr reference to const i
const int* const      pci = &i;  // Const pointer to const i (perfect consistency)

说实话,我看不出该提案如何提高一致性。 int *constexpr pci;不允许用于指针,那么为什么应该允许它用于引用?

事物似乎从一开始就具有一致性:

constexpr const int *a; // constexpr (and const) pointer to const int
constexpr const int &a; // constexpr (but not const) reference to const int

是的,添加constexpr本身并不能作为引用const,但我认为不需要对其进行修复。 (const检举和非const参考之间有什么区别?)

请注意,constexpr不是类型的一部分,而是变量的属性。 (例如constexpr int x;声明的x类型为const int,而不是某些假设的constexpr int)。