Visual Studio 2012 делает это правильно? станд :: ход

Вопрос, на который я недавно пытался ответить, казался ошибкой в ​​поддержке c ++ 11 vs2012.

В частности, не удалось скомпилировать std :: map с неконструктивно-копируемым value_type, несмотря на то, что для вставки в карту используется только std :: move. Либо выбрана неправильная перегрузка вставки, либо компилятор не рассматривает альтернативу.

По сути, я не хочу знать, если следующий код:

#include <iostream>
#include <memory>
#include <utility>
#include <type_traits>

class Foo {
};

using namespace std;

int main() {
cout << is_constructible<pair<const int,unique_ptr<Foo> >, pair<const int,unique_ptr<Foo> >& >::value << '\n';
cout << is_constructible<pair<const int,unique_ptr<Foo> >, pair<const int,unique_ptr<Foo> >&& >::value << '\n';
}

дает вывод 01.

1

Решение

Visual Studio выходы (увидеть это в прямом эфире):

1
1

Что явно не так, и оба gcc а также clang дать ожидаемые результаты. Эта ошибка и исходная проблема, которую вы видите, могут быть связаны с этими двумя принятыми отчетами об ошибках. Неправильные результаты из is_constructible на самом деле может быть не связано с оригинальный баг:

1

Другие решения

Других решений пока нет …