C++ 使用枚举变量调用构造函数

C++ calling a constructor with enum variable

有class定义如下

class IOOptions
{
    public:
    IOOptions(int opt = 0) : _options(opt) { }
    \ blah blah
    typedef enum { OPT1= 1, OPT2= 2} IOOopts;

    protected:
    int _options;
};

现在下面两个语句是等价的吗?

是的,两种说法的效果是一样的。但是还有第三种选择,很多人可能会觉得更清楚:

IOOptions io(IOOptions::OPT1);

是的,他们是。第一条语句结束时隐式调用构造函数。编译器将尝试将枚举值转换为 IOOptions 对象,并将使用提供的构造函数自动执行此操作,因为构造函数未标记为 explicit。 (单参数非 explicit 构造函数可隐式用于可隐式转换为构造函数参数类型的类型与声明构造函数的类型之间的转换。)

如果你把你的构造函数改成explicit IOOptions(int opt = 0) : _options(opt) { }那么你会发现第一种语句形式不再编译,但是第二种形式会继续编译成功。