Какая опция/библиотека компилятора мне нужна для использования признака типа detect_or_t?

Я пытаюсь использовать std::experimental::detect_or_t из <experimental/type_traits>.

Какой компилятор, опция, версия или библиотека мне нужны для компиляции следующего примера из http://en.cppreference.com/w/cpp/experimental/is_detected ?

#include <experimental/type_traits>
#include <cstddef>

template<class T>
using diff_t = typename T::difference_type;

template <class Ptr>
using difference_type = std::experimental::detected_or_t<std::ptrdiff_t, diff_t, Ptr>;

struct Meow { using difference_type = int; };
struct Purr {};

int main()
{
    static_assert(std::is_same<difference_type<Meow>, int>::value, "Meow's difference_type should be int!");
    static_assert(std::is_same<difference_type<Purr>, std::ptrdiff_t>::value, "Purr's difference_type should be ptrdiff_t!");
}

Я пытался использовать clang++ -std=c++14 и g++ -std=c++14. Также с -std=c++1y и -std=c++17. Я всегда получаю это:

main.cpp:8:44: error: 'detected_or_t' in namespace 'std::experimental' does not name a template type


person alfC    schedule 05.04.2016    source источник
comment
Кажется, работает с GCC 6. Попробуйте на gcc.godbolt.org   -  person melak47    schedule 05.04.2016
comment
@melak47, проверено godbolt.org/g/1tOlXq   -  person alfC    schedule 05.04.2016
comment
Вы можете отслеживать это на Github как для libc++, так и для libstdc++. Он поддерживается в последнем, но еще не в первом.   -  person TemplateRex    schedule 05.04.2016
comment
Работает с g++ 6.3.1 -std=c++14 (c++14 is the default anyway) и clang++ 3.8.1 -std=c++14.   -  person alfC    schedule 24.02.2017


Ответы (1)


Эти трейты были впервые добавлены в libstdc++ в GCC 6.1.0, как описано в GCC. 6 примечаний к выпуску:

  • Экспериментальная поддержка большинства функций второй версии Library Fundamentals TS.

И таблицы состояния реализации в руководстве по адресу https://gcc.gnu.org/onlinedocs/gcc-6.1.0/libstdc++/manual/manual/status.html#table.cxx1z_ts_status

Я менее уверен в libc++, но они не поддерживаются версией в Clang 3.9.1, но поддерживаются текущим стволом, поэтому я думаю, что они впервые появились в Clang 4.0.0.

person Jonathan Wakely    schedule 17.02.2017