为什么所有type_traits类都必须使用'typename'和':: type'Prefix/Suffix来调用?

Jak*_*dle 0 c++ templates typename type-traits c++11

这是一个奇怪的问题,虽然很明显:

为什么在所有模板<type_traits>都被一个名为typenname::type前缀/后缀?

当然,一个原因是没有像C++ 0x这样的模板化typedef using,它允许以下内容:

template<typename T>
using remove_ref = typename std::remove_reference<T>::type;

remove_ref<int&> foo = 4;
Run Code Online (Sandbox Code Playgroud)

所以这个问题不太重要,为什么它目前是这样的,而是更多关于这种行为是否会在未来的C++标准中被简化?.

类似的改进可能会带来如下特征std::is_pointer<T>::value- 我已经可以在C++ 14/17的视野中看到模板化的常量,它们可以使用类似的东西std::is_pointer<T>.

注意:据我所知,这种简化不是任何有关即将推出的C++标准的已发布项目的主题.在这种情况下,这个问题没有真正的是/否答案,并且这个线程可以充当pro/con列表,是否可能在任何新版本的C++中更改.

编辑:

感谢@Drew_Dormann和@erenon正确地指出已经有_t所有类型特征模板添加的版本正是这样做的.

然而,它仍然是开放的,std::is_pointer除了std::is_pointer<T>()-Version 之外,是否有任何迹象表明价值特征会成为类似简化的一部分?

ere*_*non 5

在c ++ 14中,有一个remove_reference_t,这正是您正在寻找的.