在c ++中错误地使用显式关键字

时间:2017-05-24 16:33:36

标签: c++ explicit explicit-constructor

我想创建一个类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

1 个答案:

答案 0 :(得分:6)

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

void fn(MPSNode x); // or void fn(const MPSNode& x)
fn(3.0);

如果您没有使用explicit,则会编译上面的代码段,并且调用fn的行等同于:

fn(MPSNode(3.0));

这是从doubleMPSNode隐式转化。缩小转化次数与此相关性很小。

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

MPSList mps{n};

如果你想捕捉这样的问题,请使用统一的初始化语法。