Ответ 1
Да, это должна быть ошибка.
is_move_constructible
определяется в терминах is_constructible
, что требует, чтобы конструкция с заданными параметрами была хорошо сформирована, что явно не здесь.
[C++11: Table 49]:
is_move_constructible<T>
is_constructible<T, T&&>::value
истинно
[C++11: 20.9.4.3/6]:
Учитывая следующий прототип функции:template <class T> typename add_rvalue_reference<T>::type create();
условие предиката для специализации шаблона
is_constructible<T, Args...>
должно выполняться тогда и только тогда, когда следующее определение переменной будет хорошо сформировано для некоторой изобретенной переменнойt
:T t(create<Args>()...);
(Следующее примечание поясняет, что create
используется здесь, чтобы избежать самого Vexing Parse для всех Args
.)
Для записи вывод 0
с GCC 4.8.
Аналогичная ошибка с is_*constructible
, относящаяся к абстрактным классам похоже, была исправлена в середине 2013 года, а здесь еще один:
Отправлено Microsoft в 18/09/2013 в 13:17 Привет,
Спасибо за сообщение об этой ошибке. Мы исправили его, и исправление доступно в VS 2013 RC.
Фактически, мы переработали, исправили все известные ошибки. Вы можете узнать об этом подробнее: http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking-changes-in-vs-2013.aspx
Стефан Т. Лававей
Старший разработчик - библиотеки Visual С++
[email protected]
В списке изменений этой ссылки содержится следующее исправление:
is_constructible семейство признаков типа, которые ведут себя неправильно со ссылками (DevDiv # 517460)
Итак, дайте это снова в MSVS ноябрь 2013 CTP.
Обновление: Мне сказали, что это исправлено в ноябрьском CTP. Спасибо Andy Prowl для тестирования.