在使用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”的概念听起来令人信服吗?
答案 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
)。