我想创建一个类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;
};
创建MPSList类对象的CPP文件。
#include <iostream>
#include "MPSList.hpp"
int main() {
double n = 10.9;
MPSList mps(n);
}
在编译上面的CPP文件时,我原本期望在初始化对象时看到错误。当我传递一个double时,构造函数显然期望一个int。
编译命令:
g++ -std=c++14 -I../include test.cpp
./a.out
答案 0 :(得分:6)
显式停止编译器执行以下操作:
void fn(MPSNode x); // or void fn(const MPSNode& x)
fn(3.0);
如果您没有使用explicit
,则会编译上面的代码段,并且调用fn
的行等同于:
fn(MPSNode(3.0));
这是从double
到MPSNode
的隐式转化。缩小转化次数与此相关性很小。
但是,您会发现以下内容无法编译:
MPSList mps{n};
如果你想捕捉这样的问题,请使用统一的初始化语法。