C++ c+;中显式关键字的使用不正确+;

C++ c+;中显式关键字的使用不正确+;,c++,explicit,explicit-constructor,C++,Explicit,Explicit Constructor,我想创建一个类MPSList,其中构造函数有一个与之关联的显式关键字 以下是最简单的代码: class MPSList { public: explicit MPSList(i

我想创建一个类MPSList,其中构造函数有一个与之关联的显式关键字

以下是最简单的代码:

class MPSList {                                                                           
public:                                                                                   
    explicit MPSList(int n) : n_(n) {                                                     
        mpsL.resize(n_, std::vector<MPSNode>{});                                          
        std::cout << mpsL.size() << std::endl;                                            
     }

private:
    struct MPSNode {                                                                      
        double s_;                                                                        
    };

    std::vector<std::vector<MPSNode>> mpsL;
    int n_ = -1;
}; 

显式停止编译器执行以下操作:

void fn(MPSNode x); // or void fn(const MPSNode& x)
fn(3.0);
如果不使用
explicit
,则会编译上述代码段,并且调用
fn
的行相当于:

fn(MPSNode(3.0));
这是从
double
MPSNode
的隐式转换。缩小转换范围与此关系不大

但是,您会发现以下内容无法编译:

MPSList mps{n};

如果要捕获类似问题,请使用统一初始化语法。

显式阻止编译器执行以下操作:

void fn(MPSNode x); // or void fn(const MPSNode& x)
fn(3.0);
如果不使用
explicit
,则会编译上述代码段,并且调用
fn
的行相当于:

fn(MPSNode(3.0));
这是从
double
MPSNode
的隐式转换。缩小转换范围与此关系不大

但是,您会发现以下内容无法编译:

MPSList mps{n};

如果您想发现这样的问题,请使用统一的初始化语法。

这不是说明符的目的-它只是防止,例如:在您的情况下,这将是
MPSList mps=n
可以在示例中使用delete关键字来删除构造函数的
double
float
版本?Idk,如果它会工作,但给它一个尝试!这不是说明符的目的-它只是防止,例如:在您的情况下,它将是
MPSList mps=n
可以在示例中使用delete关键字来删除构造函数的
double
float
版本?Idk,如果它会工作,但给它一个尝试!