在查看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;
而不是
template <class T>
using is_void_t = typename is_void<T>::type;
然后人们可以在没有提升风格enable_if_t<is_void_t<T>,T>
的情况下编写enable_if
,并且撰写表达式会更容易(例如enable_if_t<(is_void_t<T> || is_integral_t<T>),T>
答案 0 :(得分:4)
“别名类型对元函数的值是否有任何优势?”
在is_void_t
和兄弟姐妹(第4页)的规格之前,从链接的N3655引用:
4补充提议的措辞
提供以下措辞是为了回应LWG的要求,即为所有类型特征始终提供
::type
成员的别名,而不仅仅是那些归类为 TransformationTraits的> I>。因此,本节提供了完成设置所需的规范。
这解释了为什么“类型到值的元函数(例如is_void
)在提案中也是类型别名”:为了保持一致。
此外,将名称“is_void_t
”用于别名is_void<T>::value
是错误的。 “_t
”后缀始终表示类型。对于该值,也许可以使用“ _v
”后缀。那么我们就会有两个:
template <class T>
using is_void_t = typename is_void<T>::type;
template <class T>
constexpr bool is_void_v = is_void<T>::value;
那应该在C ++ 14中编译,然后你可以编写像enable_if_t<(is_void_v<T> || is_integral_v<T>),T>
这样的东西。但是我觉得值别名“不太需要”而不是类型1:它不会节省多少打字,而且,如你所说,你可以使用具有相同效果的短is_void<T>{}()
(和C一样) ++ 11,is_void<T>{}
通常就足够了,感谢operator bool()
}。