当前位置: 首页 > 知识库问答 >
问题:

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

郏经纬
2023-03-14
#include <iostream>
using namespace std;

constexpr int r =100;
int main()
{
    constexpr int &k = r ;
    cout << k << endl;
}

编译此代码会给出“错误:将'const int'绑定到'int类型的引用

共有1个答案

云宜人
2023-03-14

在< code>int后添加< code>const进行编译。

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

问题是constepxr暗示常量,因此当您定义r

constexpr int r =100;

您将<code>constexpr</code>定义为<code>int const</code>值(还应考虑<code>常量</code>应用于左侧的类型;仅当左侧没有类型时才应用于右侧;因此<code>const int</code>和<code>intconst<-code>是同一回事)。

但是你的< code>k

constexpr int & k = r ;

不是对 int constconst 引用(由 constexpr 暗示),而只是对 intconst 引用。

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

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

 类似资料:
  • 我有以下代码 我已经阅读了(MSDN) 关键字<code>constexpr</code>在C 11中引入,并在C 14中进行了改进。它表示常量表达式。与<code>const</code>一样,它可以应用于变量,因此如果任何代码试图修改值,就会引发编译器错误。 阅读后,我认为可以使用代替,但是对于上面的代码,我收到一个编译器错误,指出 当 被 替换时,它可以正常工作。我不理解这种行为;有人能说出

  • 问题内容: Java的设计者是否有任何理由认为不应为局部变量提供默认值?认真地讲,如果实例变量可以被赋予默认值,那为什么我们不能对局部变量做同样的事情呢? 问题答案: 声明局部变量主要是为了进行一些计算。因此,程序员决定设置变量的值,并且不应采用默认值。如果程序员错误地没有初始化局部变量并且使用默认值,则输出可能是一些意外值。因此,在使用局部变量的情况下,编译器将要求程序员在访问变量之前使用一些值

  • 当您尝试在中使用Constexpr时,如下所示: gcc和clang投诉: 错误:无法将::main声明为内联 错误:'main'不允许声明为constexr 让我们看看constexpr函数的要求是什么: constexpr函数必须满足以下要求: 它必须不是虚拟的 它的返回类型必须是文学类型 它的每个参数都必须是文字类型 什么是文学类型? 文字类型是以下任一类型 void(自c 14起) 功能体

  • 此代码编译: 该代码不: 报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 构造函数未定义或不是 ,例如。从叮叮当当: 为什么? (可能与这个问题有关,但在使用时应该是完整的;只有仍然不完整。

  • C++1z将引入“constexpr if”-一个将根据条件删除其中一个分支的if。似乎合理有用。 但是,没有constexpr关键字就不行吗?我认为在编译过程中,编译器应该知道编译时是否知道条件。如果是的话,即使是最基本的优化级别也应该移除不必要的分支。 例如(参见godbolt:https://godbolt.org/g/ipy5y5): Godbolt explorer显示,即使带有-o0的

  • 为什么 C 编译器可以将函数声明为 constexpr,而 constexpr 不能是 constexpr? 例如:http://melpon.org/wandbox/permlink/AGwniRNRbfmXfj8r 输出: 为什么此行出错: