В куске кода, который я недавно рассмотрел, который скомпилирован с 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));
afaik, хотя я не совсем знаком с ходами (и я знаю, что 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 компиляция без ошибок
- g++ - 4.7.3 дает внутреннюю ошибку компилятора
- g++ - 4.8.1 дает ошибку компиляции
- clang++ - 3.2.1 компилируется без ошибок
Итак, возникает вопрос: какой компилятор прав с точки зрения стандарта? Стандартно ли это требование является недопустимым оператором, действительным оператором или просто это undefined?
Добавление
Мы договорились, что некоторые из этих компиляторов, такие как 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: не универсально компилируемая