2016-04-05 1 views
1

Я пытаюсь использовать std::experimental::detect_or_t от <experimental/type_traits>.Какая опция/библиотека компилятора мне нужно использовать свойство типа detect_or_t?

Какой компилятор, опция, версия или библиотека мне нужно скомпилировать следующий пример от 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

+5

Кажется, работает с GCC 6. Попробуйте на http://gcc.godbolt.org – melak47

+1

@ melak47, подтвержденный https://godbolt.org/ g/1tOlXq – alfC

+1

Вы можете отслеживать это на Github для обоих [libC++] (https://github.com/llvm-mirror/libcxx) и [libstdC++] (https://github.com/gcc-mirror/gcc/tree/master/libstdc%2B%2B-v3). Он поддерживается в последнем, но еще не в первом. – TemplateRex

ответ

1

Эти черты были впервые добавлены в libstdC++ в GCC 6.1.0, как описано в GCC 6 release notes:

  • Экспериментальная поддержка большинства функций второй версии Основы библиотеки 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.

Смежные вопросы