O padrão não exige que isso seja compilado em nenhuma cadeia de ferramentas!
Primeiro, lembre-se de que vector<bool>
é esquisito e de assinatura que fornece um objeto temporário do tipo proxy chamado std::vector<bool>::reference
, em vez de real bool&
.
A mensagem de erro está informando que ele não pode vincular esse temporário a uma const
referência sem valor na template <typename T> std::swap(T& lhs, T& rhs)
implementação genérica .
Extensões!
No entanto, acontece que o libstdc ++ define uma sobrecarga para std::swap(std::vector<bool>::reference, std::vector<bool>::reference)
, mas essa é uma extensão do padrão (ou, se estiver lá, não consigo encontrar nenhuma evidência para isso).
A libc ++ também faz isso .
Suponho que a implementação stdlib do Visual Studio, que você ainda está usando, não o faça , mas para adicionar insulto à lesão, você pode vincular temporariamente a referências de valor no VS (a menos que esteja usando o modo de conformidade). A função padrão "genérica" std::swap
funciona até você substituir o compilador VS pelo compilador Clang mais rigoroso.
Como resultado, você depende de extensões em todas as três cadeias de ferramentas para as quais funcionou para você, e a combinação Clang no Windows é a única que realmente exibe conformidade estrita.
(Na minha opinião, essas três cadeias de ferramentas deveriam ter diagnosticado isso para que você não enviasse código não portátil o tempo todo.)
E agora?
Pode ser tentador adicionar sua própria especialização de std::swap
e std::vector<bool>::reference
, mas você não pode fazer isso para tipos padrão; de fato, entraria em conflito com as sobrecargas que libstdc ++ e libc ++ optaram por adicionar como extensões.
Portanto, para ser portátil e compatível, você deve alterar seu código .
Talvez um bom antiquado:
const bool temp = vb[0];
vb[0] = vb[1];
vb[1] = temp;
Ou use a função de membro estático especial que faz exatamente o que você queria :
std::vector<bool>::swap(vb[0], vb[1]);
Também soletrável da seguinte forma:
vb.swap(vb[0], vb[1]);
operator[]
um lvalue? e podestd::swap
operar com rvalues e xvalues?