这个GitHub文件的代码使用了我不熟悉的C++变量"声明"语法:
std::unique_ptr<CRecentFileList> {m_pRecentFileList} = std::make_unique<CRecentFileList>(...
Run Code Online (Sandbox Code Playgroud)
(m_pRecentFileList在超类中声明为红色.)
将大括号中的变量声明包装起来是什么意思?(不是初始化列表)
我提取了一个最小的测试用例,它编译:
class foo {
int* p;
void f(){
std::unique_ptr<int> {p} = std::make_unique<int>(1);
}
};
Run Code Online (Sandbox Code Playgroud)
更改int* p以std::unique_ptr<int> p创建由于的编译错误unique_ptr(const unique_ptr&) = delete;
这使我认为braced声明分配给具有相同名称的外部作用域变量.我尝试创建一个测试程序,但无法编译:
int main(){
int x;
int {x} = 1;
}
Run Code Online (Sandbox Code Playgroud)
error: using temporary as lvalue [-fpermissive]
T.C*_*.C. 47
这不是宣言.这是临时任务.
在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);.)