What compiler option/library do I need to use detect_or_t type trait?

我的梦境 提交于 2020-01-05 14:09:15

问题


I am trying to use std::experimental::detect_or_t from <experimental/type_traits>.

What compiler, option, version or library do I need to compile the following example from 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!");
}

I tried using clang++ -std=c++14 and g++ -std=c++14. Also with -std=c++1y and -std=c++17. I always get this:

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


回答1:


Those traits were first added to libstdc++ in GCC 6.1.0, as documented in the GCC 6 release notes:

  • Experimental support for most features of the second version of the Library Fundamentals TS.

And the implementation status tables in the manual, at https://gcc.gnu.org/onlinedocs/gcc-6.1.0/libstdc++/manual/manual/status.html#table.cxx1z_ts_status

I'm less sure about libc++, but they're not supported by the version in Clang 3.9.1 but are supported by the current trunk, so I think they first appeared in Clang 4.0.0



来源:https://stackoverflow.com/questions/36418570/what-compiler-option-library-do-i-need-to-use-detect-or-t-type-trait

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!