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 (и стандарт С++ говорит об обратном), тогда как первый пример с 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 используется здесь, чтобы избежать самого 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 для тестирования.