this GitHub file的代码使用了我不熟悉的C变量"declaration"语法:
std::unique_ptr<CRecentFileList> {m_pRecentFileList} = std::make_unique<CRecentFileList>(...
( m_pRecentFileList
是超类中的声明 . )
将大括号中的变量 declaration 包装起来是什么意思? (不是初始化列表)
我提取了一个最小的测试用例,它编译:
class foo {
int* p;
void f(){
std::unique_ptr<int> {p} = std::make_unique<int>(1);
}
};
由于 unique_ptr(const unique_ptr&) = delete;
,将 int* p
更改为 std::unique_ptr<int> p
会创建编译错误
这使我认为braced声明分配给具有相同名称的外部作用域变量 . 我尝试创建一个测试程序,但无法编译:
int main(){
int x;
int {x} = 1;
}
错误:使用临时值作为左值[-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
点被删除,而临时取得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);
. )