赋值运算符的对象构造

时间:2017-10-08 08:11:22

标签: c++ constructor initialization

我想知道使用赋值运算符的对象构造工作,在我看到这个问题之前从未见过:

return by value calls copy ctor instead of move

简化示例代码:

class A
{
    public:
        int x;
        A(int _x):x(_x){ std::cout << "Init" << std::endl;}
        void Print() { std::cout << x << std::endl; }
        A& operator = ( const int ) = delete;
};

int main()
{
    A a=9;
    a.Print();
}

写的是

A a(9);
A a{9};
A a=9;

都一样吗?

1 个答案:

答案 0 :(得分:3)

这与赋值运算符无关,它的初始化,更准确地说是copy initialization,它只是在初始值设定项中使用等号。

  

当声明非引用类型T的命名变量(自动,静态或线程局部)时,初始化程序由等号后跟表达式组成。

对于A a = 9;,将调用approriate构造函数(即A::A(int))来构造a 1

A a(9);direct initializationA a{9};direct list initialization(自C ++ 11以来),它们都会导致A::A(int)被调用以构造对象对于这种情况。 2

1 在C ++ 17之前,仍然需要在概念上使用适当的移动/复制构造函数。即使它可能已经优化但仍然必须可访问。从C ++ 17开始,这不再需要了。

2 请注意,这些初始化样式之间仍存在细微差别,它们可能会在某些特殊情况下产生不同的影响。