Неправильное использование явного ключевого слова в переполнении стека

Я хотел создать класс 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

1

Решение

Явное останавливает компилятор делать что-то вроде этого:

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

Приведенный выше фрагмент будет скомпилирован, если вы не используете explicitи линия, которая вызывает fn эквивалентно:

fn(MPSNode(3.0));

Это неявное преобразование от double в MPSNode, Сужающиеся преобразования имеют относительно мало общего с этим.

Однако вы обнаружите, что следующее не будет компилироваться:

MPSList mps{n};

Используйте единый синтаксис инициализации, если вы хотите поймать подобные проблемы.

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector