代码之家  ›  专栏  ›  技术社区  ›  nyanpasu64

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

c++
  •  51
  • nyanpasu64  · 技术社区  · 6 年前

    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;

    这使我认为bracked声明分配给具有相同名称的外部范围变量。我试图创建一个测试程序,但未能编译:

    int main(){
        int x;
        int {x} = 1;
    }
    

    error: using temporary as lvalue [-fpermissive]

    1 回复  |  直到 6 年前
        1
  •  46
  •   T.C. Yksisarvinen    6 年前

    这不是声明。这是临时工的任务。

    std::unique_ptr<int> {p} = std::make_unique<int>(1); , std::unique_ptr<int> {p} 创建一个 unique_ptr 临时取得对象所有权 p 指向,然后 std::make_unique<int>(1) 分配给该临时对象,从而导致对象 要删除的点和临时拥有 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); )