C++ std::move上发生了不必要的转换
为什么编译器认为我试图在下面的代码中将C++ std::move上发生了不必要的转换,c++,c++11,stdarray,uniform-initialization,C++,C++11,Stdarray,Uniform Initialization,为什么编译器认为我试图在下面的代码中将Container类型的对象转换为MoveTest类型的对象?为什么带括号的构造函数被转发到move\u things变量?用()替换{}当然可以解决问题 #include <iostream> #include <array> using namespace std; static constexpr int NUMBER{2}; class MoveTest { public: MoveTest(const MoveTes
Container
类型的对象转换为MoveTest
类型的对象?为什么带括号的构造函数被转发到move\u things
变量?用()
替换{}
当然可以解决问题
#include <iostream>
#include <array>
using namespace std;
static constexpr int NUMBER{2};
class MoveTest {
public:
MoveTest(const MoveTest&) {
cout << "MoveTest(const MoveTest&)" << endl;
}
MoveTest(MoveTest&&) {
cout << "MoveTest(MoveTest&&)" << endl;
}
MoveTest() {
cout << "MoveTest()" << endl;
}
};
class Container {
public:
Container() = default;
Container(Container&&) = default;
Container(const Container&) = default;
std::array<MoveTest, NUMBER> move_things;
};
int main() {
Container container;
__attribute__((unused)) Container another_one{std::move(container)};
return 0;
}
这段代码在G++5.3.0上编译得很好。您使用哪种编译器?请参阅@MattiaF。刚刚编辑的问题
{}
是这里的聚合初始化。它试图构建你的move\u东西数组
这段代码在G++5.3.0上编译得很好。您使用哪种编译器?请参阅@MattiaF。刚刚编辑的问题{}
是这里的聚合初始化。它试图构建你的move\u事物数组
Could not convert ‘std::move<Container&>((* & container))’ from ‘std::remove_reference<Container&>::type {aka Container}’ to ‘MoveTest`
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)