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