可以在C++ 14中使用类型值元函数作为变量别名吗?

abi*_*bir 5 c++ type-traits template-aliases variable-templates c++14

在查看C++ 14的元函数别名提议(TransformationTraits Redux,v2,N3655)时,我注意到,不仅类型转换类型(例如add_const),类型到值元函数(例如is_void)也是类型别名.(N3797中没有).

混淆类型对元函数的值是否有任何优势?我认为,可以在没有这些别名的情况下使用它们,例如enable_if_t<is_void<T>::value,T>enable_if_t<is_void<T>{}(),T>存在转换操作时.(我猜is_void<T>::type::value是一样的is_void<T>::value)

如果类型值元函数需要是别名,不要将它们作为变量模板别名(我没有C++ 14编译器,也从不使用变量模板.所以语法可能是错误的)?例如别名is_void

template <class T>
constexpr bool is_void_t = is_void<T>::value;
Run Code Online (Sandbox Code Playgroud)

代替

template <class T>
using is_void_t = typename is_void<T>::type;
Run Code Online (Sandbox Code Playgroud)

然后一个人可以在enable_if_t<is_void_t<T>,T>没有助推风格的情况下写作enable_if,并且构图表达将更容易(例如enable_if_t<(is_void_t<T> || is_integral_t<T>),T>

gx_*_*gx_ 4

\xe2\x80\x9c 别名类型对元函数赋值有什么优势吗?\xe2\x80\x9d

\n\n

引用链接的 N3655,在is_void_t和 兄弟姐妹的规格之前(第 4 页):

\n\n
\n

4 补充拟议措辞

\n\n

以下措辞是为了响应 LWG\xe2\x80\x99s 的请求而提供的,::type即为所有类型特征一致地提供成员别名,而不仅仅是那些分类为TransformationTraits的特征。因此,本节提供了完成该套件所需的规范。

\n
\n\n

这解释了为什么\xe2\x80\x9ctype 值元函数(例如is_void)在提案中也被类型别名 \xe2\x80\x9d :为了一致性。

\n\n

此外,使用名称 \xe2\x80\x9c \xe2\x80\x9d 作为别名是错误的。\xe2\x80\x9c \xe2\x80\x9d 后缀始终表示类型。对于该值,也许可以使用 \xe2\x80\x9c \xe2\x80\x9d 后缀。所以我们就会同时拥有:is_void_tis_void<T>::value_t_v

\n\n
template <class T>\nusing is_void_t = typename is_void<T>::type;\n\ntemplate <class T>\nconstexpr bool is_void_v = is_void<T>::value;\n
Run Code Online (Sandbox Code Playgroud)\n\n

这应该在 C++14 中编译,然后你可以编写诸如enable_if_t<(is_void_v<T> || is_integral_v<T>),T>. 但我觉得值别名 \xe2\x80\x9cless 需要 \xe2\x80\x9d 比类型一:它不会节省那么多的打字,而且,正如你所说,你可以使用具有is_void<T>{}()相同效果的短(对于 C++11,is_void<T>{}通常就足够了,这要归功于它operator bool())。

\n