Здесь происходит неявная конструкция . Вы правы в том, что компилятор достаточно «умен», чтобы знать, что вы можете создать string_wrapper
из std::string
, и это делает это автоматически для вас.
Чтобы остановить это, вы можете использовать * Ключевое слово 1007 * вроде этого:
...
explicit string_wrapper(string i_string);
...
Ключевое слово explicit
сообщает компилятору, что вы не хотите, чтобы оно автоматически создавало string_wrapper
объекты для вас из std::string
. Это может помешать отслеживать ошибки, поскольку предотвращает случайное создание объектов (особенно при возврате функции и при передаче аргументов).
Неявное построение может происходить, когда у объекта есть только один не заданный по умолчанию параметр (неявное преобразование - это то, что вы также должны исследовать). Это может быть мощным инструментом и может разрешать такие вещи, как прокси-классы и прозрачные API (т.е. ссылочный класс std::vector
). Как правило, вы должны объявлять конструкторы с одним параметром (или с одним значением по умолчанию) (и операторы преобразования) explicit
, если вы не принимаете проектное решение не слишком.