c++ - 我可以用 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);
}
解决方案
是的,它可以。您可以使用任何值类别初始化对象。
在构造类型时,它将简单地使用正确的重载调用其构造函数,例如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
推荐阅读
- c++ - 为什么向量的 .at() 成员函数返回引用而不是迭代器?
- angular - 如何使用 RxJs 定期抓取 REST API?
- ios - 当应用程序被杀死状态时,点击推送通知后无法导航到 ViewController
- javascript - 具有相同文本的多个值没有获得确切的选定文本偏移量
- python - 尽管有选项,但鼻子测试没有代码覆盖率
- git - 如何更改 BitBucket 上所有提交中的文件内容?
- bash - 使用 Platypus 创建可点击文件以运行 docker
- javascript - 如何将 id 添加到 the_post_thumbnail()?
- php - 在 smarty 项目 php 文件中使用 smarty 变量
- uwp - UWP 应用中的 Chromium