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 за тестирование.

Другие вопросы по тегам