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

let*_*ite 1 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;
}; 
Run Code Online (Sandbox Code Playgroud)

创建MPSList类对象的CPP文件.

#include <iostream>

#include "MPSList.hpp"

int main() {
    double n = 10.9;
    MPSList mps(n);    
}
Run Code Online (Sandbox Code Playgroud)

在编译上面的CPP文件时,我原本期望在初始化对象时看到错误.当我传递一个double时,构造函数显然期望一个int.

编译命令:

g++ -std=c++14 -I../include test.cpp 
./a.out
Run Code Online (Sandbox Code Playgroud)

Art*_*cca 6

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

void fn(MPSNode x); // or void fn(const MPSNode& x)
fn(3.0);
Run Code Online (Sandbox Code Playgroud)

如果您不使用explicit,上面的代码段将编译,并且调用的行fn等效于:

fn(MPSNode(3.0));
Run Code Online (Sandbox Code Playgroud)

这是一个隐式转换doubleMPSNode.缩小转换率与它相关性很小.

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

MPSList mps{n};
Run Code Online (Sandbox Code Playgroud)

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