C++ : 在左侧常量赋值上添加引用/别名 (&) 是多余的吗?
C++ : Is adding an reference/alias (&) on a left hand const assignment redundant?
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';
运行代码
我们当然可以同意,这对于"优化"来说是不可接受的吗?
更重要的是,通过引用的访问可能不如访问值的效率,因为在某些情况下,引用会导致额外的取消引用操作。
相关文章:
- 部分定义/别名模板模板参数
- 如何在C++20中创建模板别名的推导指南
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 告诉c++编译器该参数没有别名
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 继承模板类中的类型别名
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 如何使用类型别名从模板化类中隐藏模板列表
- 模板模板参数和模板别名:编译器错误?
- 使用定义函数模板别名
- 为模板参数包添加别名
- 如何检测类型类型别名?
- C++类型别名,其中值被替换
- C++使用默认模板参数键入别名和转发声明
- 为什么在C++使用常量函数时常量是多余的?
- C++ : 在左侧常量赋值上添加引用/别名 (&) 是多余的吗?