Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Разница в поведении std::ofstream

Почему
#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)


Ответ

На основании п.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

Комментариев нет:

Отправить комментарий