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

jim*_*qaz 51 c++

这个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* pstd::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);.)

  • 我想我找到了这个功能被打破的原因.最初的开发人员认为他找到了一种构建新对象的聪明方法(他经常这样做).实际上,对象/指针一旦被构造就被删除,导致应用程序在调用函数后崩溃(因为指针被重置为0xCCCCCCCC). (13认同)
  • 它是干什么用的? (12认同)
  • @Ville-Valtteri:混淆`delete m_pRecentFileList`: - /(用无用的分配BTW). (7认同)
  • 请说明这项任务的确切运作方式. (4认同)