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; }
};