有很多关于constexpr表达式的问题,但我有一个问题与其他问题非常相似,但在另一方面略有不同。无论如何,以下是我的问题。
#include <iostream>
using namespace std;
constexpr int x = 1; // TAG A
int main() {
constexpr int &xf = x; // TAG B error out
const int &xf1 = x; // TAG C works
constexpr int const &xf2 = x; // TAG D works
return 0;
}
错误:
Binding reference of type 'int' to value of type 'const int' drops 'const' qualifier [reference_bind_drops_quals]
评论:
- 标签A清楚地显示x为const int。根据C++ Primer第5版第2.44节“声明为constexpr的变量隐式为const,必须由常量表达式初始化:”。所以这样做很好。
- 标记B-->错误消息暗示constexpr没有将变量xf隐式“const”。因此xf为int&。这与标记A矛盾。为什么?
- 标签C-->这是对const的通常引用
- 标记D-->额外添加“const”使其成为const引用,因为它在标记B中的行为。
“引用到const”和“const引用”这个词有区别吗?
似乎“引用到const”意味着引用正在引用const对象,同时不允许进行修改,而“const引用”是指引用是const但可以指向const或非const对象。
这是一件非常令人困惑的事情。
constexpr int &xf = x;
和const int &x;
没有什么不同。这里的const表示引用不允许修改所指对象,因为后者是const。我只是不明白为什么constexpr int &xf = x;
不等同于const int &xf = x
,因为根据《C++ Primer》的说法,constexpr隐含地意味着const。 - yapkm01