为啥我不能使用 constexpr 全局变量来初始化 constexpr 引用类型?

Posted

技术标签:

【中文标题】为啥我不能使用 constexpr 全局变量来初始化 constexpr 引用类型?【英文标题】:Why can I not use a constexpr global variable to initialize a constexpr reference type?为什么我不能使用 constexpr 全局变量来初始化 constexpr 引用类型? 【发布时间】:2019-02-04 02:39:32 【问题描述】:
#include <iostream>
using namespace std;

constexpr int r =100;
int main()

    constexpr int &k = r ;
    cout << k << endl;

编译此代码会在编译时给出“错误:将‘const int’绑定到‘int&’类型的引用丢弃限定符”。

【问题讨论】:

【参考方案1】:

编译在int之后添加const

constexpr int const & k = r ;
// ...........^^^^^

问题是constepxr暗示const,所以当你定义r

constexpr int r =100;

您将constexpr 定义为int const 值(还要考虑const 应用于左侧的类型;仅当左侧没有类型时才应用于右侧;所以@987654331 @ 和 int const 是同一个东西)。

但是你的k

constexpr int & k = r ;

不是const(由constexpr 暗示)对int const 的引用,而只是constint 的引用。

而且您不能使用int const 值初始化对int 变量的引用。

您可以通过使k 成为constint const 的引用来解决该错误。

【讨论】:

谢谢 max66 。我对 C++ 比较陌生,但据我了解 constexpr 是隐含的 const 。我明白一旦我们在指针上定义了一个 constexpr ,它基本上是***的 const ,即它自身的指针是 const 指针而不是指向 const 的指针。对于没有将其声明为 constexpr 的引用类型意味着它的 const 即对 const 的引用(在这种情况下为 int ?) @praveen 它是对非 const int 的 constexpr 引用,这至少有一定意义。您不能有 constexpr 非常量值。例如,template&lt;int &amp; x&gt;struct foofoo()++x;; 是一种递增一些位于 constexpr 的 int 的类型,但该 int 没有 constexpr 值。参考是 constexpr;值不是。

以上是关于为啥我不能使用 constexpr 全局变量来初始化 constexpr 引用类型?的主要内容,如果未能解决你的问题,请参考以下文章

使用 constexpr 成员函数初始化 constexpr 成员变量

当 const 有效时,为啥我不能声明 constexpr local?

c++11:为啥静态 constexpr 的类内初始化不是定义?

为啥多处理工作者不能更改全局变量? [复制]

C语言所有变量都默认为auto,全局变量不能为auto,那全局变量默认为啥?

JS全局变量是全局对象的属性,函数局部变量为啥就不是函数的属性呢?