Dlaczego is_move_constructible zwraca false przy usuniętym konstruktorze przenoszącym?

0

Czy ktoś mądry może mi powiedzieć, dlaczego B i C nie są move-constructible?

#include <iostream>
#include <type_traits>
using namespace std;

struct A
{
	A(const A&) {}
};

struct B
{
	B(const B&) {};
private:
	B(B&&);
};

struct C
{
	C(const C&) {};
	C(C&&) = delete;
};

int main() 
{
	cout << boolalpha << is_move_constructible<A>::value << endl;    // true
	cout << boolalpha << is_move_constructible<B>::value << endl;    // false
	cout << boolalpha << is_move_constructible<C>::value << endl;    // false
}

http://ideone.com/Dbhile

http://en.cppreference.com/w/cpp/concept/MoveConstructible

Types without a move constructor, but with a copy constructor that accepts const T& arguments, satisfy std::is_move_constructible.

3

Wszystko jest ok.

W B bedzie błąd kompilacji, jeżeli spróbujesz stowrzyć ten obiekt z rvalue - konstruktor jest prywatny.
W Cdokładnie to samo - zostanie użyty konstruktor, który jest usunięty, więc będzie błąd.

Przecież to, że konstruktor jest prywatny czy usunięty nie spowoduje, że zostanie użyty jakiś inny dostępny. Najpierw zostanie określone, że ten należy użyć (bo jest zadeklarowany) a dopiero potem okaże się, że nie można.

1 użytkowników online, w tym zalogowanych: 0, gości: 1