【发布时间】:2019-10-27 13:42:35
【问题描述】:
我在玩 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
“Consexpr const”参考?嗯?文档clearly says:
对象声明中使用的
constexpr说明符暗示const。
引用是一个对象。那么,当 const 已经是 constepxr 时,为什么我们还需要它呢?但是,如果 i 是 const,我们还需要它。看起来很沮丧。
但是在“引用 const”的帮助下,挫败感不再存在。让我们调用crci“constexpr 对 const i 的引用”。现在很明显const 应用于被引用对象,而constexpr 应用于引用本身,说明它可以在 constexpr 上下文中使用。而且它是 const,因为所有引用都是 const。完全有道理。为了使其与指针更加一致,我们甚至可能使用了以下假设语法:
const int& constexpr crci = i; // Constexpr reference to const i
const int* const pci = &i; // Const pointer to const i (perfect consistency)
但这不是 C++ 的工作原理,无论好坏。
“引用 const”这个概念真的帮助我理解了“constexpr const 引用”这个东西。
你怎么看? “引用 const”的概念听起来对您有说服力吗?
【问题讨论】:
-
在这种情况下,我同意你的观点(如果我理解正确的话):命名应该命名为“引用 const int”的东西是一种不好的方式(一种令人困惑的方式)。
-
魔鬼的拥护者:您可以将
const int&绑定到非constint。 -
@VittorioRomeo 就像你可以将
const int*绑定到一个非常量整数一样。然而我们确实说“指向 const 的指针”。 -
这是一个语言问题,但似乎不是关于C++语言的问题,而是关于英语的问题。在 C++ 中,无论在语义上还是句法上,它都作为“对 const 的引用”;人们只是不喜欢多余的音节。事实上,类似
int & const r = i的“常量指针”的并行构造不是有效构造。 -
@rustyx 更多魔鬼的宣传:至少存在一些混淆,因为我们有时会看到涉及惊喜的问题,例如
T是带有模板参数int&的模板参数,const T不是const int&而是int&。尽管我们也看到了关于指针的类似问题,但尚不清楚更精确的语言是否或多少有助于避免这种混淆。
标签: c++ pointers language-lawyer constexpr