我想知道使用赋值运算符的对象构造工作,在我看到这个问题之前从未见过:
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;
都一样吗?
答案 0 :(得分:3)
这与赋值运算符无关,它的初始化,更准确地说是copy initialization,它只是在初始值设定项中使用等号。
当声明非引用类型
T
的命名变量(自动,静态或线程局部)时,初始化程序由等号后跟表达式组成。
对于A a = 9;
,将调用approriate构造函数(即A::A(int)
)来构造a
。 1
A a(9);
为direct initialization,A a{9};
为direct list initialization(自C ++ 11以来),它们都会导致A::A(int)
被调用以构造对象对于这种情况。 2
1 在C ++ 17之前,仍然需要在概念上使用适当的移动/复制构造函数。即使它可能已经优化但仍然必须可访问。从C ++ 17开始,这不再需要了。
2 请注意,这些初始化样式之间仍存在细微差别,它们可能会在某些特殊情况下产生不同的影响。