C++ 定义赋值运算符=仅允许零rhs,否则为赢得';不编译
简而言之:C++ 定义赋值运算符=仅允许零rhs,否则为赢得';不编译,c++,C++,简而言之: 如何为我的类定义operator=,使其仅在rhs为0(obj=0)时编译 但如果rhs为非0值,则给出编译错误。 我知道这是可能的,忘了怎么做 更长: 我有C类。我想允许为这个类的对象赋值obj=0(这意味着重置对象),但是没有定义来自其他整数或指针的赋值。除obj=0外,未定义从整数或从指针的转换 C obj; obj = 0; // reset object 在操作符=中,我可以执行断言(rhs==0),但这还不够好。 我知道这是可能的 定义运算符=以便 如果rhs不是0,则
如何为我的类定义operator=,使其仅在rhs为0(obj=0)时编译
但如果rhs为非0值,则给出编译错误。
我知道这是可能的,忘了怎么做 更长:
我有C类。我想允许为这个类的对象赋值obj=0(这意味着重置对象),但是没有定义来自其他整数或指针的赋值。除obj=0外,未定义从整数或从指针的转换
C obj;
obj = 0; // reset object
在操作符=
中,我可以执行断言(rhs==0)
,但这还不够好。我知道这是可能的 定义
运算符=
以便如果rhs不是0,则给出编译错误。忘记细节。
有人能加满吗 谢谢使用指向成员的指针: 由于无法访问
foo::rhs\u必须为0
,因此无法命名指向此类成员的指针。您可以命名的成员的唯一指针是空指针,也称为文本零
演示在使用指向成员的指针:
由于无法访问foo::rhs\u必须为0
,因此无法命名指向此类成员的指针。您可以命名的成员的唯一指针是空指针,也称为文本零
演示为什么会有人想这样做?如果重置对象,请编写一个名为
reset
的方法。还是您的意图是混淆试图读取您的代码的人?@Axel:'=0'操作对于智能指针很常见。对于行为类似于某种ID的类。与常规指针类似,on wihch=0“因重置而重载”。所以对于ID-like和SmartPointer类,我认为这是一种行之有效的做法。OTOH,你有150个类,每个类都有“reset”方法,当你需要跟踪在特定的p->reset()调用中调用了哪个reset()时,这比=0更好吗?没什么区别。为什么有人想这么做?如果重置对象,请编写一个名为reset
的方法。还是您的意图是混淆试图读取您的代码的人?@Axel:'=0'操作对于智能指针很常见。对于行为类似于某种ID的类。与常规指针类似,on wihch=0“因重置而重载”。所以对于ID-like和SmartPointer类,我认为这是一种行之有效的做法。OTOH,你有150个类,每个类都有“reset”方法,当你需要跟踪在特定的p->reset()调用中调用了哪个reset()时,这比=0更好吗?没有看到太大的差异。但示例编译在foof,g;f=g
。似乎您还应该将foo&operator=(const-foo&)
private.@Lol4t0:这不是OP所要求的。无论如何,我会更新答案,谢谢您的建议。@Lol4t0:f=g如果g是同一类型的,就可以了。f=1必须被禁止,f=n(其中n是int!=0)必须被禁止。我没有说任何任务都是不允许的。我说过,如果rhs是整数,那么它应该在0时编译,如果不是0则不编译。@Andrei:所以这将按要求工作(前提是你没有一个非显式的构造函数,它接受int
)。rhs类型是一些模板化的部分定义类型,难道没有解决方案吗?但是示例是在foo f上编译的,Gf=g
。似乎您还应该将foo&operator=(const-foo&)
private.@Lol4t0:这不是OP所要求的。无论如何,我会更新答案,谢谢您的建议。@Lol4t0:f=g如果g是同一类型的,就可以了。f=1必须被禁止,f=n(其中n是int!=0)必须被禁止。我没有说任何任务都是不允许的。我说过如果rhs是整数,那么当它是0时它将编译,如果它不是0则不编译。@Andrei:那么这将按要求工作(前提是你没有一个非显式的构造函数,它接受int
)。rhs类型是一些模板化的部分定义类型,难道没有解决方案吗?
class foo
{
// Give it a meaningful name so that the error message is nice
struct rhs_must_be_zero {};
// The default operator= will still exist. If you want to
// disable it as well, make it private (and the copy constructor as well
// while we're at it).
foo(const foo&);
void operator=(const foo&);
public:
foo& operator=(int rhs_must_be_zero::*) { return *this; }
};