Mam taki kod:
#include <vector>
#include <utility>
int main()
{
std::vector<bool> vb{true, false};
std::swap(vb[0], vb[1]);
}
vector<bool>
Pomijając argumenty na temat rozsądku , działało to dobrze:
- Clang dla komputerów Mac
- Visual Studio dla Windows
- GCC dla systemu Linux
Następnie próbowałem zbudować go za pomocą Clanga w systemie Windows i otrzymałem następujący błąd (skrócony):
error: no matching function for call to 'swap'
std::swap(vb[0], vb[1]);
^~~~~~~~~
note: candidate function [with _Ty = std::_Vb_reference<std::_Wrap_alloc<std::allocator<unsigned int> > >, $1 = void] not viable: expects an l-value for 1st argument
inline void swap(_Ty& _Left, _Ty& _Right) _NOEXCEPT_COND(is_nothrow_move_constructible_v<_Ty>&&
Dziwi mnie, że wyniki różnią się w zależności od implementacji.
Dlaczego nie działa z Clangiem w systemie Windows?
/permissive-
(zgodnością), co i tak powinno być ogólnie używane;)
operator[]
? i możestd::swap
działać na wartościach i wartościach?