Когда число с плавающей запятой вставляется в std::vector<int>
, число должно быть преобразовано путем какого-либо округления. Обычно это изменяет число, 1.5 изменяется на 1 или 2, и я ожидал бы, что компилятор должен предупредить об этом преобразовании. Таким образом, я использую -Wconversion
флаг g++ или клана g++. Это позволяет использовать предупреждения для std::vector::push_back
или прямого назначения, но не для std::copy
или std::vector::assign(iterator first, iterator end)
.
Теперь мой вопрос: как мне получить предупреждения о конверсиях для std::copy
и std::vector::assign
?
Вот моя примерная программа:
#include <iostream>
#include <vector>
#include <algorithm>
using source_type = std::vector<double>;
using target_type = std::vector<int>;
int main() {
source_type vsource;
target_type vtarget1;
target_type vtarget2;
target_type vtarget3;
target_type vtarget4;
// Fill source with a number
vsource.push_back(1.5);
// This will give a compiler warning as expected
vtarget1.push_back(vsource.at(0));
// This does not give a warning, why not?
vtarget2.assign(vsource.begin(), vsource.end());
// Also this does not give a warning, why not?
vtarget3.assign(vsource.size(), 0);
std::copy(vsource.begin(), vsource.end(), vtarget3.begin());
// The following should be equivalent to std::copy according to
// http://www.cplusplus.com/reference/algorithm/copy/?kw=copy
// Here we get a warning as expected (in contrast to std::copy).
vtarget4.assign(vsource.size(), 0);
auto source = vsource.begin();
auto target = vtarget4.begin();
while (source != vsource.end()) {
*target = *source;
++target; ++source;
}
std::cout << vsource.at(0) << " "
<< vtarget1.at(0) << " "
<< vtarget2.at(0) << " "
<< vtarget3.at(0) << " "
<< vtarget4.at(0) << std::endl;
return 0;
}
Я компилирую с:
g++ -Wall -Wextra -Wconversion -std=c++11 -pedantic
clang++ -Wall -Wextra -Wconversion -std=c++11 -pedantic
Я получаю только два предупреждения, я хочу иметь еще несколько:
question.cpp:22:24: warning: implicit conversion turns floating-point number into integer: 'value_type' (aka 'double')
to 'value_type' (aka 'int') [-Wfloat-conversion]
vtarget1.push_back(vsource.at(0));
question.cpp:40:18: warning: implicit conversion turns floating-point number into integer: 'double' to 'int'
[-Wfloat-conversion]
*target = *source;