是否可以编写一个这样的类以使其有效:

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/

10-11 22:42
查看更多