首页 > 解决方案 > 我可以用 L 值初始化一个常量整数吗?

问题描述

我的作业中有一个问题要求我评估以下函数调用是否正确。我不确定是否可以使用 const int& 类型的变量初始化const int。我知道一个 const int 可以用另一个 int 初始化,例如

int i=3; const int j=i 

工作得很好,但我不确定以下代码在语义上是否正确(行 const int j=bar(++i);)

int foo (int& i) {return i+=2;}

const int& bar(int &i){ return i+=2;}

int main(){
   int i=5;
   const int j=bar(++i);
}

标签: c++constantsc++14

解决方案


是的,它可以。您可以使用任何值类别初始化对象。

在构造类型时,它将简单地使用正确的重载调用其构造函数,例如type(type&& other)or type(type const&)

对于平凡的类型,它总是一个副本。因此,只要类型兼容,无论它们的值类别如何,它都可以工作。

初始化引用是不同的。您必须有一个具有兼容值类别的表达式。例如,从您的函数创建一个可变引用将不起作用:

int& j = bar(++i); // won't compile, int& cannot be bound to int const&

这是因为bar返回对 const 的引用,因此不能绑定到对 mutable 的引用。


附带说明一下,即使它是一个 int 常量,它也不再是编译时常量。因此,您将无法将其用作数组大小或模板参数。

要解决这个问题,您必须使用constexpr,这将保证您的变量的值在编译时可用。

int a = 9;
constexpr int b = a; // Won't work, `a` is a runtime value, `b` is compile time

constexpr int a = 1;
constexpr int b = a + 1; // Works! Both compile time values

推荐阅读