Я хотел создать класс 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;
};
CPP-файл, который создает объект класса MPSList.
#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
Явное останавливает компилятор делать что-то вроде этого:
void fn(MPSNode x); // or void fn(const MPSNode& x)
fn(3.0);
Приведенный выше фрагмент будет скомпилирован, если вы не используете explicit
и линия, которая вызывает fn
эквивалентно:
fn(MPSNode(3.0));
Это неявное преобразование от double
в MPSNode
, Сужающиеся преобразования имеют относительно мало общего с этим.
Однако вы обнаружите, что следующее не будет компилироваться:
MPSList mps{n};
Используйте единый синтаксис инициализации, если вы хотите поймать подобные проблемы.
Других решений пока нет …