一个可以为多个构造函数消除 0 (NULL) 的歧义吗?和赋值运算符?

Posted

技术标签:

【中文标题】一个可以为多个构造函数消除 0 (NULL) 的歧义吗?和赋值运算符?【英文标题】:Can one disambiguate 0 (NULL) for multiple constructors ? and assignment operators? 【发布时间】:2011-10-12 22:40:23 【问题描述】:

在 GCC 更高版本中。当一个有多个使用引用或指针的构造函数时,一个(如果可以的话)如何消除“0”或“NULL”的歧义?

即:

class XXX

public:
    XXX(const XXX &tocopy);
    XXX(const char *fromAString);
    XXX(const AnotherThing *otherThing);

    operator=(const XXX &tocopy);
    operator=(const char *fromAString);
    operator=(const AnotherThing *otherThing);
;

// nice not to have to cast when setting to NULL for 
// things like smart pointers and strings. Or items that can be initialized from 
// several types of objects and setting to null means "clear"

XXX anXXX = NULL;
anXXX = 0;

// In MSC one can have an 
//    XXX(const int &nullItem)  DEBUG_ASSERT(!nullItem); setnull();  
// and the overloads would be disambiguated.  GCC will cause a const int to conflict
// with pointer types.

【问题讨论】:

【参考方案1】:

C++ 有一个类型系统,所以变量有类型,编译器使用这些类型来执行重载解析:

const char * p = 0;
const AnotherThing * q = 0;

XXX a(p), b(q); // uses the respective constructors for the static type of p, q

如果由于没有使用所需的指针类型之一而导致重载不明确,则会出现错误:

XXX c(0); // error: ambiguous

【讨论】:

也不要使用const char*,而是更喜欢对指针的引用。并且可能使这些 ctors 明确。 同意单参数构造函数最好声明为explicit 对 f(const vector& x) 的 f(10) 调用会有点整洁 =) sry。 意味着你不能在不强制转换 NULL 的情况下创建一个可以设置为“NULL”的变体指针类。有一个“NullType”会很好,这样人们就可以进行一个只能分配“const int 0”并且不与显式类型冲突的重载。 MSC 将通过指针和引用类型解析 const int,而 GCC 不会。 @peterk:不过,我看不出这有什么用。那个假定的空构造函数会做什么?你为什么不把它实现为默认构造函数呢?

以上是关于一个可以为多个构造函数消除 0 (NULL) 的歧义吗?和赋值运算符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥SqlParameter名称/值构造函数将0视为null?

在构造函数中将类对象强制转换为接口始终返回NULL [duplicate]

通过构造函数注入的对象上的注册事件(PropertyChanged始终为null)

从用户定义的函数中消除空查询结果

Java对象构造

js的构造函数共用事例