隐式定义的副本分配运算符
Implicitly-defined copy assignment operator
class B
{
public:
B(int& a) :ref(a){}
B(B const&) = default;
int& ref;
};
void main()
{
int a1 = 1, a2 = 2;
B b1(a1), b2(b1), b3(a2);
b3 = b1;
}
如果编译器实现的隐式定义的副本分配运营商是
B& operator=(const B& rhs)
{
this->ref = rhs.ref;
return *this;
}
为什么不能生成参考?最初的别名边界不影响变量A,因为在"复制分配运算符"中,参考变量ref的数字值已更改。
它可以做到这一点,因为参考不能反弹到另一个。
如果编译器会像您提供的那样生成一个函数,我会这样做:
struct Ref {
int& num;
// hypotetical operator= generated
};
// ...
int a = 2;
int b = 5;
Ref ra{a};
Ref rb{b};
ra = rb; // now a = 5. Quite confusing.
a = 3; // still changes what value `ra.num` yeild. rb is not affected.
// will print "false".
std::cout << std::boolalpha << (ra.num == rb.num) << std::endl;
这会导致一些讨厌的错误。
我对这个问题的首选解决方案是不在乎。我认为大多数用例绝对不需要operator=
。
但是,如果您真的想向类的用户提供operator=
,则可以持有指针或std::reference_wrapper
而不是参考。两者都可以使您的班级可以分配,从而可以重新启动参考。在这两个之间,我通常更喜欢指针,因为我认为它们更容易使用。
struct Ref {
std::reference_wrapper<int> num;
};
// -- or --
struct Ref {
Ref(int& ref) : num{&ref} {}
int* num;
};
// ...
int a = 2;
int b = 5;
Ref ra{a};
Ref rb{b};
ra = rb; // now ra.num and rb.num are bound to the same reference.
相关文章:
- 正在尝试重载二进制搜索树分配运算符
- 自定义先决条件对移动分配运算符有效吗
- C++ - 没有自定义交换功能的移动分配运算符?
- 强制复制分配超过移动分配运算符
- 在之后仍需要使用源对象时调用父移动分配运算符
- c++ 使用动态分配运算符反向数组元素
- 当存在用户定义的移动分配运算符时,已删除模板移动分配运算符
- C++ - 从移动分配运算符调用复制分配
- 不工作 复制分配运算符
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- 返回对象如何与分配运算符一起工作
- 下标是否在分配运算符的右侧进行评估
- C++分配适用于已删除的分配运算符
- 用于删除复制/移动分配运算符的有效签名
- 使用新放置作为复制分配运算符不好吗?
- C++ - 父级中的 CRTP 分配运算符不起作用
- 复制派生类的分配运算符
- 未定义 Lambda 复制分配运算符
- 为什么标准在移动分配运算符中使用交换?
- 正确编写复制构造函数和分配运算符的方法