首页 文章

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

提问于
浏览
51

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 回答

  • 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 点被删除,而临时取得 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); . )

相关问题