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

为什么右值不能分配给 constexpr 引用变量

暨高洁
2023-03-14

我有以下代码

constexpr int into(int a,int b)
{
  int c=a*b;
  return c;
}

int main()
{
 constexpr int &n=into(5,5);

}

我已经阅读了(MSDN)

关键字<code>constexpr</code>在C 11中引入,并在C 14中进行了改进。它表示常量表达式。与<code>const</code>一样,它可以应用于变量,因此如果任何代码试图修改值,就会引发编译器错误。

阅读后,我认为可以使用constexpr代替const,但是对于上面的代码,我收到一个编译器错误,指出

`int main()':
invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'`

constexprconst 替换时,它可以正常工作。我不理解这种行为;有人能说出一些光芒吗?

共有2个答案

惠野
2023-03-14
匿名用户

标记为< code>constexpr的表达式将在编译时解析,这将把< code>into(5,5)的结果视为< code>int文字。众所周知,在C中引用不能绑定到< code>int文字。

您可以通过使在全局范围内并在主范围内显示在调用main之前强制解析x,然后允许将引用绑定到x来实现此工作。出现在全局范围内并在main中创建对xconst引用:

constexpr int into(int a,int b) {
  int c=a*b;
  return c;
}

// guaranteed to be resolved before main is called
constexpr int x = into(5,5);

int main() {
 constexpr const int& n = x;
 static_assert(n == 25, "whoops!");
}

为了具体回答您的问题,这与右值或移动语义学完全正交,而是的细微差别。

如果全局作用域让您感到心痛,那么您可以将x也设置为static,并将其初始化放在引用绑定之前,这在我看来更自然:

constexpr int into(int a,int b) {
  int c=a*b;
  return c;
}  

int main() {
 // guaranteed to be resolved before main is called
 static constexpr int x = into(5,5);
 constexpr const int& n = x;
 static_assert(n == 25, "whoops!");
}

洪鸿博
2023-03-14

与应用于intconst不同,constexpr关键字将const直接应用于引用类型int>的变量

typedef int &int_ref;

int main() {
    int x = 1;
    int &a = x;          // OK
    int_ref b = x;       // OK, int_ref is 'int &'
    const int &c = 1;    // OK, reference to const int
    const int_ref d = 1; // error: type of d is 'int &'
                         // qualifier on reference are being ignored
}

< code>constexpr int

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

  • 问题内容: 以下语句: 因错误而失败: 为什么在这里需要演员表? 我发现了几篇文章,解释了为什么您不能进行反向操作(将T分配给a),但这是显而易见的(可以理解)。 注意:我在Eclipse Luna下对此进行编码,所以我不知道这是Luna Quirk还是泛型中确实不了解的东西。 问题答案: 协方差vs协方差vs不变性 是 不变的 。 结果是, 是 不是一个亚型 的 在Java中,变量可以保存 相同

  • 问题内容: 有关语法的简单问题。为什么限制这样的表达式: 并只允许以下内容: ? 问题答案: 这是因为方法引用或lambda表达式的目标类型应该是功能接口。仅基于此,运行时将创建提供给定功能接口的实现的类的实例。将lambda或方法引用视为概念。将其分配给功能接口类型将赋予其具体含义。 此外,特定的lambda或方法引用可以具有多个功能接口作为其目标类型。例如,考虑以下lamda: 这个lambd

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

  • 以下代码编译确定: 但是嵌套列表不会: 这是为什么?如果我需要这样做,“正确”的方法是什么? 用例是我有一个方法,它返回许多不同集合中的一个,其中元素类型本身是泛型的,每个可能的返回值都有不同的定义类型,其中返回值取决于传入的参数。目前,作为一种解决方法,我将结果分配给一个变量,其中类型是带有通配符的集合类型(即<code>列表

  • 问题内容: 我试图为对象类型分配一个lambda: 它给我一个错误的说法: 为什么会这样,怎么做? 问题答案: 这是不可能的。根据错误消息不是功能接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如