Объявление экземпляра без имени переменной c ++

Задав вопрос Ошибка связывания C ++ в файле потребителя, вызванная полем статических данных, я попробовал два разных объявления для экземпляра StateConservator:

StateConservator cs(*pContainer, pDoc->GetConfiguration());

и

StateConservator(*pContainer, pDoc->GetConfiguration());

Первый сделал то, что я хочу, он передает деструктор только после окончания области видимости. Второй передает деструктор в собственной строке самого объявления.

Правильно ли ведет себя компилятор? Если это правильное поведение, как можно объявить анонимную переменную в этой строке?


person sergiol    schedule 20.03.2015    source источник
comment
Хм? Вы создали временный; да, сразу уничтожается. Что, черт возьми, вы ожидаете сделать с временным в долгосрочной перспективе, если вы не можете на самом деле называть его по имени?   -  person Lightness Races in Orbit    schedule 20.03.2015
comment
Я не знаю, почему вы голосуете против вопроса, который проясняет сомнения, которые есть у многих людей.   -  person sergiol    schedule 20.03.2015
comment
Ни у кого больше не было этого сомнения.   -  person Lightness Races in Orbit    schedule 20.03.2015
comment
@sergiol это хорошо задокументированное поведение   -  person Mgetz    schedule 20.03.2015
comment
Это просто бессмысленно, @sergiol. Вы никогда не выходите и не говорите нам, что вы пытаетесь сделать, но это выглядит так, будто вы хотите найти способ отключить автоматическое уничтожение временного (чего вы можете добиться, привязав его к ссылке, между прочим - но тогда, конечно, просто сначала объявите это нормально). Но зачем вам это делать? Это глупо. Это бессмысленно. Это определенно не то, о чем думают многие; наоборот. Сообщите нам свою актуальную цель, и, возможно, мы сможем что-то для вас сделать.   -  person Lightness Races in Orbit    schedule 20.03.2015


Ответы (1)


В C ++ не может быть «безымянных» объектов. Во втором случае объект создается и уничтожается мгновенно, потому что он не связан с именем. Связь с именем (например, переменной) дает объектную область, которая контролирует его время жизни. Если объект не именуется, его время жизни привязано к оператору. Если ему присвоено имя, то он привязан к области, в которой это имя объявлено.

person D.Shawley    schedule 20.03.2015
comment
Что ж, с новым оператором мы можем иметь безымянные объекты ... или нет? - person Paolo M; 20.03.2015
comment
Оператор new создает то, что я бы назвал несвязанными объектами. Динамическое размещение просто меняет область действия. Если не прикрепить результат к имени, происходит утечка памяти. Область действия, которая контролирует время жизни, - это распределитель - в большинстве случаев пул памяти на уровне процесса. - person D.Shawley; 20.03.2015
comment
использование оператора new для создания экземпляра класса StateConservator полностью уничтожит его единственную цель - неявно вернуться в предыдущее состояние. @PaoloM - person sergiol; 20.03.2015
comment
@sergiol использование оператора new для создания экземпляра класса StateConservator ... безусловно, плохая идея! - person πάντα ῥεῖ; 20.03.2015
comment
А что насчет std::lock_guard<std::mutex>(mutex);? Потому что в этом случае имя переменной не имеет значения. - person DrumM; 28.10.2019
comment
@DrumM - я считаю, что объект будет создан и немедленно уничтожен. IOW, вы объявляете объект, конструируете его и уничтожаете в той же строке. Имя не имеет значения, но время жизни объекта, конечно, не то, что вы намереваетесь, поскольку вы будете владеть только блокировкой для выполнения инструкции. Он не останется заблокированным для других операторов, потому что будет немедленно уничтожен. - person D.Shawley; 28.10.2019
comment
Ага, правильно. Нашел в другой теме. Спасибо! - person DrumM; 28.10.2019