В 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 ответ:
это не декларация. Это назначение временное.
на
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);
.)