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

时间:2018-07-04 09:33:26

标签: c++

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]

1 个答案:

答案 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);。)