Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类初始化中的唯一指针_C++_C++11_Unique Ptr_In Class Initialization - Fatal编程技术网

C++ 类初始化中的唯一指针

C++ 类初始化中的唯一指针,c++,c++11,unique-ptr,in-class-initialization,C++,C++11,Unique Ptr,In Class Initialization,假设我有一个unique_ptr成员对象,我想在类中初始化它,请参见下面的代码。为什么我必须使用统一初始化(大括号)?第二个声明抛出了一个错误,类似于 so.cpp:10:31: error: expected parameter declarator std::unique_ptr<Foo> upf2(new Foo); ^ so.cpp:10:31: error: expected ')' so.cpp:10:30: note:

假设我有一个
unique_ptr
成员对象,我想在类中初始化它,请参见下面的代码。为什么我必须使用统一初始化(大括号)?第二个声明抛出了一个错误,类似于

so.cpp:10:31: error: expected parameter declarator
std::unique_ptr<Foo> upf2(new Foo);
                          ^
so.cpp:10:31: error: expected ')'
so.cpp:10:30: note: to match this '('
std::unique_ptr<Foo> upf2(new Foo);                             ^
2 errors generated. 
so.cpp:10:31:错误:预期参数声明符
std::唯一的ptr upf2(新的Foo);
^
so.cpp:10:31:error:expected')'
so.cpp:10:30:注意:要匹配此'('
std::唯一的ptr upf2(新的Foo)^
产生2个错误。
我不认为这是一个最烦人的解析问题,至少我不这么认为

#include <memory>

class Foo
{

};

class Bar{
    std::unique_ptr<Foo> upf1{new Foo}; // works fine
//    std::unique_ptr<Foo> upf2(new Foo); // error here
};

int main() 
{
    Bar bar;
}
#包括
福班
{
};
分类栏{
std::unique_ptr upf1{new Foo};//工作正常
//std::unique_ptr upf2(新Foo);//此处出错
};
int main()
{
酒吧;
}

因为这些是规则。类中的初始值设定项必须使用“大括号”或“等于”;事实上,语法元素称为大括号或等于初始值设定项

int=42;//确定
std::unique_ptr大括号{new Foo};//也可以
我不知道为什么不允许使用括号;也许是为了避免初始化看起来像函数声明。当直接初始化和大括号初始化之间存在差异时,这可能会令人恼火:

std::vector<int> bad(6);                     // ERROR: parentheses not allowed
std::vector<int> good{6};                    // OK but not the same
std::vector<int> ugly = std::vector<int>(6); // OK but ugly
std::vector bad(6);//错误:不允许使用括号
std::vector good{6};//好,但不一样
std::vector丑恶=std::vector(6);//正常但丑恶

非静态数据成员初始值设定项(NSDMI)必须使用大括号或相等的初始值设定项。不允许使用
(表达式列表)
形式的初始化

如前所述,为了使NSDMI的行为更像传统的构造函数成员初始值设定项列表,在整个类的范围内查找初始值设定项中的名称。不幸的是,这意味着允许括号初始值设定项将无法确定某个内容是初始值设定项还是函数在解析声明时,执行以下操作:

// not real code
struct X {
    int i(x);    // initializer
    static int x;
};

struct Y {
    int i(x);    // function
    typedef int x;
};

这篇论文讨论了几种可能的方法来解决这个问题,即完全禁止它(“任何可以成为声明的东西都是声明”或“除非你说它是类型,否则它不是类型”),但两者都不是很吸引人,潜在的混乱被认为超过了允许这种形式初始化的好处。

NSDMIs必须使用大括号或相等的初始值设定项。@T.C.谢谢,我不知道这是必须的。谢谢,我不知道规则。语法确实很烦人,尤其是第二行
std::vector good{6}
,这不符合人们的想法。说得好,我认为这可能是某种最令人烦恼的解析问题,但我自己无法给出一个示例。谢谢!
// not real code
struct X {
    int i(x);    // initializer
    static int x;
};

struct Y {
    int i(x);    // function
    typedef int x;
};