在C++中,变量声明左侧的大括号是什么意思?

In C++, what do braces on the left-hand side of a variable declaration mean?

本文关键字:是什么 意思 C++ 变量 声明      更新时间:2023-10-16

这个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]

这不是一个声明。这是临时任务。

std::unique_ptr<int> {p} = std::make_unique<int>(1);中,std::unique_ptr<int> {p}创建一个临时unique_ptr,该获得p指向对象的所有权,然后将std::make_unique<int>(1)分配给该临时对象,这会导致对象p点被删除,临时对象获得make_unique创建的int的所有权;最后,在;, 临时本身被销毁,删除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);