初始化后修改引用所引用的对象
Modify the object on which a reference refer after initialization
我有以下代码
class A {
A(int & r)
: i(r)
{}
A(A&& obj)
: i(obj.i)
{}
operator=(A&& obj)
{
// ?
}
int& i;
}
想象下面的main
int main()
{
int r = 12;
int r2 = 21;
A a(r);
A b(r2);
b = std::move(a);
r = 42;
std::cout << "b.i value is " << b.i << std::endl;
}
我希望它打印出b.i value is 42
。
简而言之,是否有可能将i
修饰为operator=()
中的obj.i
?
简短的回答是No。
为了理解为什么答案是否定的,你需要了解什么是真正的引用。引用不是指针。事实上,引用甚至不是对象:它只是内存中另一个位置的别名。标准实际上说引用不需要有地址,所以它甚至不需要存在于内存中。众所周知,引用(在许多情况下)可能在编译时完全消失。
给定一个引用变量,不能用它来引用引用本身。对其名称的任何使用都将指向它所指向的内存位置。这就是为什么不能创建指向引用的指针。也就是说,不能取引用的地址。这很好,因为,如前所述,它甚至可能没有地址。
因此,考虑到它不一定在内存中有一个位置,并且您不能引用它的值(只有它所引用的值),您不能更改引用本身的"值"。这就是为什么在c++ 03中尝试创建一个常量引用(T& const
)是错误的。(然而,在c++ 11中,这是允许的,因为引用折叠,这在引入右值引用时是必要的)Operator =在构造函数被调用后被调用,并且引用字段不能保持未初始化—您必须在类的构造函数中设置它们。所以答案是否定的。请使用指针或智能指针。
相关文章:
- 引用对象成员函数的成员函数
- 从 Base 引用对象调用派生类的成员
- 转换引用对象的边界框?
- 现代编译器会优化只引用对象子集的局部变量吗
- l值引用对象上的Constexpr成员函数:Clang和gcc不同意
- 将 const 类型引用对象注册为类成员对象C++
- Boost Intervocess:通过迭代通过从结构引用对象的映射进行迭代时
- 无法用2D矢量成员引用对象
- 在由引用对象传递中访问由引用对象传递的变量
- 如何使用QString引用对象名称
- 使用自动迭代器引用对象
- C++ 在另一个对象中引用对象的当前状态
- 使用共享对象和引用对象进行引用计数
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 引用对象的动态类型何时可以更改
- 引用对象内部的指针
- C++从全局静态函数中引用对象
- C++如何仅在没有其他人直接或间接引用对象指针时删除该指针
- 如何使用C++引用对象
- 为什么引用对象仅保存特定类型的引用