this GitHub file处的代码使用了我不熟悉的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]
答案 0 :(得分:46)
这不是声明。这是对临时工的分配。
在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);
。)