На основе полученных комментариев:
Неявные операторы преобразования - не единственный способ, с помощью которого возвращаемое значение, изначально имеющее неправильный тип, может «стать» типом, необходимым для функции - подпись. Конструктор
Vector(size_t dimension);
Принимает в качестве аргумента одно числовое значение, которое само по себе не double
, а long unsigned int
, но double
может быть преобразовано в это.
Итак, происходит следующее: сначала double factor
преобразуется в long unsigned int
, а затем происходит неявное построение Vector
с использованием конструктора Vector(size_t dimension);
. Затем возвращается объект, который является результатом этой конструкции.
Следовательно, это действительный код в том смысле, что он не нарушает языковые правила, компилятор определенно не делает здесь ничего плохого.
Если такое поведение не требуется, соответствующий конструктор должен быть помечен explicit
следующим образом:
explicit Vector(size_t dimension);
Если было несколько конструкторов, принимающих один аргумент типа, в который можно преобразовать double
, или чьи первые аргументы удовлетворяют этому требованию, а все остальные аргументы являются необязательными, например:
Vector(int a, char b = 'c');
они также должны быть помечены explicit
, но в этом случае вполне вероятно, что компилятор пожаловаться, потому что он не может определить, какой конструктор вызвать.