В 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);)