1
考慮這個片段:的std ::交換導致無限遞歸在VS 2013
#include <utility>
struct foo
{
foo()
{
}
foo(foo&& other)
{
std::swap(*this, other);
}
};
int main(int argc, char** argv)
{
foo f(std::move(foo()));
}
它會導致在VS2013無限遞歸,但無法與編譯克++ /鐺有錯誤該operator=
被刪除(這使得有義) :
In file included from /usr/local/include/c++/5.3.0/bits/stl_pair.h:59:0,
from /usr/local/include/c++/5.3.0/utility:70,
from main.cpp:1:
/usr/local/include/c++/5.3.0/bits/move.h: In instantiation of 'void std::swap(_Tp&, _Tp&) [with _Tp = foo]':
main.cpp:11:26: required from here
/usr/local/include/c++/5.3.0/bits/move.h:186:11: error: use of deleted function 'foo& foo::operator=(const foo&)'
__a = _GLIBCXX_MOVE(__b);
^
main.cpp:3:12: note: 'foo& foo::operator=(const foo&)' is implicitly declared as deleted because 'foo' declares a move constructor or move assignment operator
struct foo
^
In file included from /usr/local/include/c++/5.3.0/bits/stl_pair.h:59:0,
from /usr/local/include/c++/5.3.0/utility:70,
from main.cpp:1:
/usr/local/include/c++/5.3.0/bits/move.h:187:11: error: use of deleted function 'foo& foo::operator=(const foo&)'
__b = _GLIBCXX_MOVE(__tmp);
^
我認爲這是一個錯誤VS。但是標準是否應該如何實施std::swap
?我的意思是這只是VS中的一個糟糕的實現或者違反了標準?
「swap」通過臨時對象移動構建似乎是合理的。 'foo(foo &&)'更常用於將_members_與它的參數交換。即foo(foo && other){swap(member,other.member); }'等 –
@TobySpeight是的我知道這不是執行移動構造函數的規範方式 - 我通常也會選擇你描述的方式,但是當我在VS中偶然發現這種行爲時,我很驚訝:D –