У меня проблема в том, что я не могу использовать определенный конструктор с инициализатором массива при использовании VS2017 (C ++ 14, C ++ 17 и последняя версия ISO).
Я получаю ошибку C2397 conversion from 'double' to 'unsigned int' requires a narrowing conversion
, когда он должен вызывать конструктор с контейнером, заполненным одним элементом.
#include <vector>
class obj
{
public:
obj(const std::vector<double>& values, unsigned int stride)
: values_(values), stride_(stride)
{
}
obj(unsigned int m, unsigned int n)
: stride_(n)
{
}
private:
unsigned int stride_;
std::vector<double> values_;
};
int main(int argc, char** argv)
{
obj m(1, 1); // correct constructor called.
obj mm({ 42.0 }, 1); // Error C2397
return 0;
}
Я могу исправить это явное объявление контейнера ...
obj mm(std::vector<double>({ 42.0 }), 1);
Или инициализация контейнера более чем одним элементом ...
obj mm({ 42.0, 12.0 }, 1);
Последний, очевидно, бесполезен, а первый немного раздражает, так как это угловой корпус для контейнеров с одним предметом (хотя и не конец света). Я подумал, что это может быть проблематично c только для двойников (без буквального объявления), однако это происходит даже для чисел с плавающей запятой при их инициализации с литералами тоже. то есть контейнер std::vector<float>
, следующая строка по-прежнему содержит ошибку C2397 .
obj mm({ 42.0f }, 1);
Я не склонен верить, что ошибки компилятора сами по себе не встречаются (хотя они, очевидно, существует), однако я не могу не думать, что это может быть один, или если нет, есть ли в стандарте упоминание, как справиться с этой ситуацией. В идеале я хотел бы иметь возможность использовать инициализатор массива без явного объявления типа контейнера, как я могу, когда в контейнере существует более одного элемента. Это возможно?