В C++, что означают скобки в левой части объявления переменной?
Код в этом файле GitHub использует синтаксис "объявления" переменной C++, с которым я не знаком:
std::unique_ptr<CRecentFileList> {m_pRecentFileList} = std::make_unique<CRecentFileList>(...
(m_pRecentFileList
объявляется в суперклассе).
Что это означает, когда вы завертываете объявление переменной в фигурных скобках? (не список инициализаторов)
Я извлек минимальный тестовый пример, который компилирует:
class foo {
int* p;
void f(){
std::unique_ptr<int> {p} = std::make_unique<int>(1);
}
};
Изменение int* p
на std::unique_ptr<int> p
создает ошибку компиляции из-за unique_ptr(const unique_ptr&) = delete;
Это заставляет меня думать, что сжатая декларация присваивает переменной внешнего вида с тем же именем. Я попытался создать тестовую программу, но она не скомпилирована:
int main(){
int x;
int {x} = 1;
}
error: using temporary as lvalue [-fpermissive]
Ответы
Ответ 1
Это не декларация. Это назначение временному.
В std::unique_ptr<int> {p} = std::make_unique<int>(1);
, std::unique_ptr<int> {p}
создает временное значение unique_ptr
которое берет на себя управление объектами p
points, то std::make_unique<int>(1)
присваивается этому временному, что приводит к тому, что объект p
указывает быть удаленным и временным, чтобы получить права собственности на int
созданный make_unique
; наконец, на ;
, временное само уничтожается, удаляя make_unique
-created int
.
Конечным результатом является delete p
плюс бесполезный цикл new/delete.
(Это было бы объявление, если бы оно использовало скобки, а не фигурные скобки: std::unique_ptr<int> (p) = std::make_unique<int>(1);
в точности эквивалентно std::unique_ptr<int> p = std::make_unique<int>(1);
)