我有这样的代码:
#include <vector>
#include <utility>
int main()
{
std::vector<bool> vb{true, false};
std::swap(vb[0], vb[1]);
}
关于是否理智的争论,在vector<bool>
以下方面效果很好:
- Mac版Clang
- Windows的Visual Studio
- 适用于Linux的GCC
然后,我尝试在Windows上使用Clang构建它,并收到以下错误(摘要):
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>&&
对于不同的实现结果,我感到惊讶。
为什么Windows上的Clang不起作用?
/permissive-
(一致性)一起编译,无论如何通常应该使用它;)
operator[]
左值的结果吗?并可以std::swap
在rvalues和xvalues上运行?