C++ : 在左侧常量赋值上添加引用/别名 (&) 是多余的吗?

C++ : Is adding an reference/alias (&) on a left hand const assignment redundant?

本文关键字:别名 多余 引用 常量 添加 赋值 C++      更新时间:2023-10-16

C++中的常量赋值是通过引用隐式完成的吗?如果是的话,那么显式生成混叠是否是多余的,例如:

const std::vector<unsigned>& chart = chartData.at(id);

即,这是否简单地等同于:

const std::vector<unsigned> chart = chartData.at(id);

让我们通过一个示例来理解您在说什么

#include <iostream>
int main()
{
    int value = 10;
    const int& char1 = value;
    const int chart2 = value;
    cout << "value =" << value << " char1 =" << char1 << " chart2 =" <<chart2 << endl;
    value++;
    cout << "value =" << value << " char1 =" << char1 << " chart2 =" <<chart2 << endl;
 }

输出

value =10 char1 =10 chart2 =10
value =11 char1 =11 chart2 =10

正如您所看到的,const int&char1创建一个引用,引用值的任何后续更改都将被char1看到。

const int char2会创建一个副本并保留已分配的值。

这两段代码不相同。考虑:

int value{1};
int const& a{value};
int const b{value};
++value;
std::cout << a << ' ' << b << 'n';

运行代码

我们当然可以同意,这对于"优化"来说是不可接受的吗?

更重要的是,通过引用的访问可能不如访问值的效率,因为在某些情况下,引用会导致额外的取消引用操作。