繁体   English   中英

赋值运算符的对象构造

[英]object construction with assignment operator

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

按值返回调用copy ctor而不是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;

全部都一样?

这与赋值运算符无关,它是初始化,更准确地说是复制初始化 ,它只是在初始化程序中使用等号。

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

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

A a(9); 直接初始化A a{9}; 直接列表初始化 (从C ++ 11开始),它们都会调用A::A(int)来构造这种情况的对象。 2


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

2 请注意,这些初始化样式之间仍存在细微差别,它们可能会在某些特定情况下导致不同的效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM