Конструктор constexpr не будет отображать данные покрытия
Сегодня я переписывал свой класс матрицы, чтобы быть constexpr
, У меня (было) 100% покрытие модульных тестов в этом классе, но я заметил, что после того, как я преобразовал почти все функции в constexpr, часть конструктора помечается в lcov как уже не покрытая вообще.
Вот класс только с конструктором.
template<typename T, std::size_t m, std::size_t n>
class Matrix
{
static_assert(std::is_arithmetic<T>::value,
"Matrix can only be declared with a type where "
"std::is_arithmetic is true.");
public:
constexpr Matrix(
std::initializer_list<std::initializer_list<T>> matrix_data)
{
if (matrix_data.size() != m)
{
throw std::invalid_argument("Invalid amount of rows.");
}
for (const auto& col : matrix_data)
{
if (col.size() != n)
{
throw std::invalid_argument("Invalid amount of columns.");
}
}
std::size_t pos_i = 0;
std::size_t pos_j = 0;
for (auto i = matrix_data.begin(); i != matrix_data.end(); ++i)
{
for (auto j = i->begin(); j != i->end(); ++j)
{
this->data[pos_i][pos_j] = *j;
++pos_j;
}
++pos_i;
pos_j = 0;
}
}
private:
std::array<std::array<T, n>, m> data{};
};
int main()
{
Matrix<double, 2, 2> mat = {
{1, 2},
{3, 4}
};
return 0;
}
Я использую gcc 7.2 с lcov 1.13
1 ответ
У меня (был) 100% охват модульным тестом в этом классе, но я заметил, после того как я преобразовал почти все функции в
constexpr
часть конструктора помечена в lcov как не покрытая вообще.
lcov
Указание непокрытого кода означает, что gcov
не инструмент это.
Все помечено constexpr
оценивается во время компиляции, gcov
данные покрытия собираются во время выполнения.
Так что это одна из причин, почему я подозреваю, почему вы не получаете данные о покрытии для каких-либо constexpr
функция.
Поскольку у вас есть шаблонный код, я не уверен, что я в курсе, но я испытал это gcov
шаблоны инструментов не очень хороши, и у вас могут остаться нулевые данные для них.
Схожи рассуждения с тем, что я сказал выше для constexpr
шаблоны оцениваются / создаются во время компиляции. Было бы, по крайней мере, трудно измерить все реально используемые экземпляры шаблона разумным способом.