是否可以编写一个这样的类以使其有效:
Foo a;
Foo b = 0;
Foo c = b;
Foo d(0);
Foo e(1);
Foo f = Foo(1);
但是这些不是:
int x;
Foo a = x;
Foo b = 1;
Foo c = 2;
//etc
本质上,我的规则是“常量
0
可隐式转换为Foo
,但没有其他值是” 最佳答案
如果您不介意Foo b = nullptr;
可以正常工作,则很容易被黑客入侵。在int
中有一个显式构造函数,在std::nullptr_t
中有一个隐式构造函数。
如果您介意该工作,我不确定是否可行。区分文字0
和其他整数文字的唯一方法是前者对指针和nullptr_t
的隐式转换。因此,nullptr
将首选nullptr_t
参数而不是指针参数,因此,通过同时使用这两个构造函数,您可以过滤掉nullptr
参数。但是,0
到指针和nullptr_t
的转换具有相同的等级,因此这会导致歧义地杀死0
参数。
嗯...类似这样的东西可能会起作用:
class Foo {
struct dummy;
public:
explicit Foo(int); // the version that allows Foo x(1);
Foo(dummy*); // the version that allows Foo x = 0;
template <typename T,
typename = typename std::enable_if<
std::is_same<T, std::nullptr_t>::value>::type>
Foo(T) = delete; // the version that prevents Foo x = nullptr;
};
我实际上没有尝试过。从理论上讲,仅当参数为
nullptr
时,模板才应参与重载解析,因为否则SFINAE会将其杀死。但是,在那种情况下,它应该比指针构造函数更好。关于c++ - 我可以将隐式初始化重载为0吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17217071/