Erstellen eines shared_ptr aus unique_ptr

In einem Code, den ich kürzlich überprüft habe, der sich gut mit kompiliert hatg++-4.6Ich bin auf einen seltsamen Versuch gestoßen, einestd::shared_ptr vonstd::unique_ptr:

std::unique_ptr<Foo> foo...
std::make_shared<Foo>(std::move(foo));

Das kommt mir merkwürdig vor. Das sollte seinstd::shared_ptr<Foo>(std::move(foo)); afaik, obwohl ich mit bewegungen nicht ganz vertraut bin (und ich weißstd::move ist nur eine Besetzung, nichts wird bewegt).

Überprüfung mit verschiedenen Compilern auf diesem SSC (NUC *) E

#include <memory>

int main()
{
   std::unique_ptr<int> foo(new int);
   std::make_shared<int>(std::move(foo));
}

Ergebnisse der Zusammenstellung:

g ++ - 4.4.7 liefert einen Kompilierungsfehlerg ++ - 4.6.4 wird fehlerfrei kompiliertg ++ - 4.7.3 gibtInterner CompilerfehlerG ++ - 4.8.1 gibt Kompilierungsfehlerclang ++ - 3.2.1 wird fehlerfrei kompiliert

Die Frage ist also: Welcher Compiler ist in Bezug auf den Standard richtig? Muss es sich nach dem Standard um eine ungültige oder gültige Aussage handeln, oder ist diese einfach undefiniert?

Zusatz

Wir haben uns darauf geeinigt, dass einige dieser Compiler, wie clang ++ und g ++ - 4.6.4, die Konvertierung zulassen, obwohl sie dies nicht sollten. Allerdings mit g ++ - 4.7.3 (was auf einen internen Compilerfehler hinweist)std::make_shared<Foo>(std::move(foo));), lehnt richtig abint bar(std::move(foo));

Aufgrund dieser enormen Verhaltensunterschiede lasse ich die Frage so, wie sie ist, obwohl ein Teil davon mit der Reduzierung auf beantwortet werden könnteint bar(std::move(foo));.

*) NUC: Nicht universell kompilierbar

Antworten auf die Frage(3)

Ihre Antwort auf die Frage