C++ c+;中显式关键字的使用不正确+;
我想创建一个类MPSList,其中构造函数有一个与之关联的显式关键字 以下是最简单的代码:C++ c+;中显式关键字的使用不正确+;,c++,explicit,explicit-constructor,C++,Explicit,Explicit Constructor,我想创建一个类MPSList,其中构造函数有一个与之关联的显式关键字 以下是最简单的代码: class MPSList { public: explicit MPSList(i
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,如果它会工作,但给它一个尝试!