Я пытаюсь использовать 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
Кажется, работает с GCC 6. Попробуйте на http://gcc.godbolt.org – melak47
@ melak47, подтвержденный https://godbolt.org/ g/1tOlXq – alfC
Вы можете отслеживать это на Github для обоих [libC++] (https://github.com/llvm-mirror/libcxx) и [libstdC++] (https://github.com/gcc-mirror/gcc/tree/master/libstdc%2B%2B-v3). Он поддерживается в последнем, но еще не в первом. – TemplateRex