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

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

std::unique_ptr foo...
std::make_shared(std::move(foo));

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

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

#include 

int main()
{
   std::unique_ptr foo(new int);
   std::make_shared(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(std::move(foo));), правильно отклоняетint bar(std::move(foo));

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

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

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

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