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)
显式停止编译器执行以下操作:
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)
这是一个隐式转换从double到MPSNode.缩小转换率与它相关性很小.
但是,您会发现以下内容无法编译:
MPSList mps{n};
Run Code Online (Sandbox Code Playgroud)
如果要捕获类似的问题,请使用统一初始化语法.
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |