#cpp #visual_cpp
Почему #include#include void touch(const std::string& name) { if (!name.empty()) std::ofstream f(name); } void main() { touch("foo"); } создает файл "foo", если его не существовало, а #include #include void touch(const std::string& name) { if (!name.empty()) std::ofstream(name); } void main() { touch("foo"); } не создает? (Visual Studio 2015 Update 2)
Ответы
Ответ 1
На основании п.8.3/6 Стандарта: In a declaration T D where D has the form ( D1 ) the type of the contained declarator-id is the same as that of the contained declarator-id in the declaration T D1 Получаем, что запись std::ofstream(name); эквивалентна записи std::ofstream name; Т.е. создание переменной типа std::ofstream с именем name конструктором по умолчанию, который, понятное дело, не создает никаких файлов. Собственно это стало бы очевиднее, если убрать функцию touch и оставить вызов std::ofstream(name); прямо в main. Ну и IntelliSense мог помочь в определении того, что name внутри if уже имеет другой тип (std::ofstream), а не std::string.
Комментариев нет:
Отправить комментарий