создание shared_ptr из unique_ptr

В коде, который я недавно рассмотрел, который хорошо скомпилирован сg++-4.6Я столкнулся со странной попыткой создатьstd::shared_ptr изstd::unique_ptr:

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

Это кажется довольно странным для меня. Это должно бытьstd::shared_ptr<Foo>(std::move(foo)); афаик, хотя я не совсем знаком с ходами (и я знаюstd::move только актерский состав, ничто не перемещено).

Проверка с различными компиляторами на этом SSC (NUC *) E

#include <memory>

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

Результаты компиляции:

g ++ - 4.4.7 выдает ошибку компиляцииg ++ - 4.6.4 компилируется без ошибокг ++ - 4.7.3 даетвнутренняя ошибка компилятораg ++ - 4.8.1 выдает ошибку компиляцииclang ++ - 3.2.1 компилируется без ошибок

Таким образом, вопрос в том, какой компилятор прав с точки зрения стандарта? Требует ли стандарт, чтобы это было недопустимым утверждением, допустимым утверждением или это просто не определено?

прибавление

Мы договорились о том, что некоторые из этих компиляторов, такие как clang ++ и g ++ - 4.6.4, разрешают преобразование, а они - нет. Однако с g ++ - 4.7.3 (который выдает внутреннюю ошибку компилятора наstd::make_shared<Foo>(std::move(foo));), правильно отклоняетint bar(std::move(foo));

Из-за этой огромной разницы в поведении я оставляю вопрос таким, какой он есть, хотя часть этого будет нести ответственность за сокращение доint bar(std::move(foo));.

*) NUC: не универсально компилируется

Ответы на вопрос(3)

Ваш ответ на вопрос