is_move_constructible и msvc2013
#include <iostream>
#include <type_traits>
struct Foo
{
Foo(Foo&& f) = delete;
};
int main()
{
std::cout << std::is_move_constructible<Foo>::value; // output is 1
std::cin.ignore();
}
Под msv2013 надо что-то забыть или есть баг?
APPENDUM:
#include <iostream>
#include <type_traits>
struct Foo
{
~Foo(){}
};
int main()
{
std::cout << std::is_move_constructible<Foo>::value;
std::cin.ignore();
}
даже с CTP эта программа выдает результат 1 (а стандарт C++ говорит об обратном), тогда как первый пример с CTP работает нормально.
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
используется здесь, чтобы избежать самого разборчивого разбора для всех 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 C++
stl@microsoft.com
Список изменений за этой ссылкой включает следующее исправление:
семейство черт типа is_constructible ведет себя некорректно с ссылками (DevDiv#517460)
Итак, попробуйте еще раз в CTP MSVS в ноябре 2013 года.
Обновление: мне сказали, что это исправлено в ноябрьской ОСАГО. Спасибо Andy Prowl за тестирование.