C ++ срок службы временного объекта, переданного в конструктор

0

У меня есть класс, который принимает ссылку istream в конструкторе. Если конструктору передан временный объект, например myclass obj(ifstream("filename")); будет ли, если бы поток был хорош для жизни obj? Зависит ли он от того, назначен ли он ссылке или указателю в классе?

Например:

class test
{
public:
    istream *p;
    test(istream &is)
    {
        p = &is;
        cout << "a constructor" << endl;
    }
    ~test()
    {
        cout << "a destructor" << endl;
    }
    bool isgood()
    {
        return p->good();
    }
};

int main()
{
    test test(ifstream("test.cpp"));
    cout << test.isgood() << endl;
}

Вывод:

a constructor
1
a destructor

Просто потому, что вывод говорит, что файл хорош, я не знаю, был ли он уничтожен или что. Если есть часть стандарта, который охватывает это, пожалуйста, дайте мне знать. благодаря

  • 3
    Этот код не должен даже компилироваться ...
  • 1
    ifstream закроется в конце блока и станет недействительным после этого. p укажет на мусор
Показать ещё 9 комментариев
Теги:
reference
pass-by-reference
temporary-objects
istream

1 ответ

2
Лучший ответ

Извините, у меня недостаточно репутации для комментариев.

Временный istream хорош только в конструкторе. Даже если вы используете адрес istream для установки значения указателя, вы больше не сможете использовать его после возврата конструктора. Поскольку после вызова конструктора временный ifstream уже закрыт и разрушен. Таким образом, указатель будет указывать на мусор, как упоминал @Josh. Вы можете изменить свой код, чтобы передать имя файла в конструктор, и использовать имя файла для инициализации элемента ifstream (а не указателя на ifstream). Затем вы можете использовать поток через продолжительность жизни объекта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню