随着 C++14 中的变量模板(并且 Clang 已经支持它们)以及标准is_same_v
和类似类型特征的提议,我认为能够按如下方式制作新的类型特征会很整洁:
template<typename T>
constexpr bool is_const_and_volatile{std::is_const_v<T> && std::is_volatile_v<T>};
唉,这会导致相当于以下 SSCCE 的错误(这个包含下面提到的所有内容):
#include <type_traits>
template<typename T>
constexpr bool is_pointer{std::is_pointer<T>::value};
template<typename T>
constexpr bool foo{is_pointer<T>};
int main() {
//foo<int *>;
}
随着main
注释行,Clang 吐出以下内容:
警告:变量
is_pointer<type-parameter-0-0>
具有内部链接但未定义
它看起来对我来说是定义的(请注意,更改T
为int *
infoo
可以正常工作)。取消注释main
以实例化的行foo
给出了这个(再次,T
工作int *
正常):
错误:constexpr 变量
foo<int *>
必须由常量表达式初始化
但是,替换foo
为以下旧语法会导致两个实例都可以正常工作:
constexpr bool foo{std::is_pointer<T>::value};
关于变量模板,我有什么遗漏吗?有没有办法用它们构建新的变量模板,或者我是否被迫使用旧语法来构建新的,并且只在将它们用于其他代码时才享受语法糖?