在下面的代码中:
struct copy_only
{
copy_only() = default;
copy_only(const copy_only&) = default;
copy_only& operator=(const copy_only&) = default;
copy_only(copy_only&&) = delete;
copy_only& operator=(copy_only&&) = delete;
~copy_only() = default;
};
std::vector<copy_only> v;
copy_only c{};
v.push_back(c);
在 MSVC 上我们得到错误:
错误 C2280:'copy_only::copy_only(copy_only &&)':尝试引用已删除的函数
这来自于向量实现中push_back(const&)
调用的emplace_back
实现:
注意:编译类模板成员函数'void std::vector<copy_only,std::allocator<copy_only>>::push_back(const _Ty &)'
注意:请参阅正在编译的函数模板实例化“_Ty &std::vector<_Ty,std::allocator<_Ty>>::_Emplace_one_at_back<const _Ty&>(const _Ty &)”的引用
这可以用 gcc 和 clang 编译。这仅仅是 MSVC 编译器在最简单的向量示例上出现的严重 bug 吗?还是说存在一些标准问题,导致 gcc 和 clang 只是敷衍了事,阻止了这种用法?