【发布时间】:2018-03-26 18:18:47
【问题描述】:
为什么会这样:
struct A
{
A(int) {
cout << "construct from int" << endl;
}
A(A&&) = delete;
A(const A &) {
cout << "copy constructor" << endl;
}
};
int main(){
A a = 0;
}
给我一个错误:
error: use of deleted function ‘A::A(A&&)’
以及为什么当我添加这样的移动构造函数时
A(A&&) {
cout << "move constructor" << endl;
}
它编译得很好,但程序的输出只是
construct from int
据我所知,编译器要求构造函数但不使用它。为什么?这对我来说毫无意义。
附:我认为
A a = 0;
等价于
A a = A(0);
但是为什么不调用移动构造函数和移动赋值运算符呢?
【问题讨论】:
-
你使用的是哪个编译器?
-
这在 C++17 中有所改变(删除的移动构造函数现在可以编译),但复制/移动省略始终是在那之前的事情。
-
我在 g++4.9、g++6.3 和 clang 5.0 上都试过了。 (-O0 -std=c++11)
-
确实,使用 -std=c++17 在 clang 5 上编译
-
现在请教一些不请自来的建议:youtube.com/watch?v=vLinb2fgkHk&t=55m51s
标签: c++ c++11 constructor copy-constructor