Страницы

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

четверг, 5 декабря 2019 г.

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

#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.

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

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