我在尝试emplace_back
使用带有微妙继承扭曲的不可复制但可移动对象的向量时遇到编译器错误,据我所知,这不会改变问题。
这是合法的 C++ 并且这是 Visual Studio 2015 的错误,还是我犯了一个明显的错误?
#include <vector>
class Base
{
public:
Base() {}
Base(Base&) = delete;
Base& operator= (Base&) = delete;
};
class Test : public Base
{
public:
Test(int i) : m_i(i) {}
Test(Test&&) = default;
Test& operator= (Test&&) = default;
protected:
int m_i;
};
int main(int argc, char *argv[])
{
std::vector<Test> vec;
vec.emplace_back(1);
}
输出 :
error C2280: 'Test::Test(Test &)': attempting to reference a deleted function
如果没有继承,即在 Test 中删除了复制构造函数并且没有基类,它可以正确编译。
不知何故,删除移动构造函数中的默认值使其也可以正确编译,但是我必须定义移动构造函数并且我不想去那里。
这意味着这编译得很好:
#include <vector>
class Test
{
public:
Test(int i) : m_i(i) {}
Test(Test&) = delete;
Test& operator= (Test&) = delete;
Test(Test&&) = default;
Test& operator= (Test&&) = default;
protected:
int m_i;
};
int main(int argc, char *argv[])
{
std::vector<Test> vec;
vec.emplace_back(1);
}
令人费解?