Почему
#include
void touch(const std::string& name)
{
if (!name.empty())
std::ofstream f(name);
}
void main()
{
touch("foo");
}
создает файл "foo", если его не существовало, а
#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
Комментариев нет:
Отправить комментарий