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

это заставляет меня думать, что braced объявление присваивает переменной внешней области с тем же именем. Я попытался создать тестовую программу, но она не компилируется:

int main(){
    int x;
    int {x} = 1;
}

error: using temporary as lvalue [-fpermissive]

1   51  

1 ответ:

это не декларация. Это назначение временное.

на std::unique_ptr<int> {p} = std::make_unique<int>(1);,std::unique_ptr<int> {p} создает unique_ptr временный, который берет на себя ответственность за объект p указывает, а потом std::make_unique<int>(1) присваивается тому временному, которое вызывает объект p указывает на удаление и временное владение int создано make_unique; наконец, на ;, сам временный уничтожается, удаляя make_uniqueсозданный int.

в чистый результат delete p плюс бесполезный новый/удалить цикл.

(это было бы объявление, если бы он использовал скобки, а не фигурные скобки: std::unique_ptr<int> (p) = std::make_unique<int>(1); в точности эквивалентно std::unique_ptr<int> p = std::make_unique<int>(1);.)