No código a seguir:
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);
No MSVC obtemos o erro:
erro C2280: 'copy_only::copy_only(copy_only &&)': tentativa de referenciar uma função excluída
Isso vem de dentro da implementação do vetor, onde push_back(const&)
chama emplace_back
a implementação:
nota: ao compilar a função de membro do modelo de classe 'void std::vector<copy_only,std::allocator<copy_only>>::push_back(const _Ty &)'
nota: veja a referência à instanciação do modelo de função '_Ty &std::vector<_Ty,std::allocator<_Ty>>::_Emplace_one_at_back<const _Ty&>(const _Ty &)' sendo compilado
Isso compila com gcc e clang. Será que isso é apenas um bug enorme do compilador MSVC no exemplo de vetor mais simples? Ou existe algum padrão que impeça esse uso, algo que o gcc e o clang estão apenas ignorando?