Ria*_*inn 88 c++ templates std sfinae
以下是如何实现的std::is_function
?
template<class T>
struct is_function : std::integral_constant<
bool,
!std::is_const<const T>::value && !std::is_reference<T>::value
> {};
Run Code Online (Sandbox Code Playgroud)
(来自CPP 参考)
在我看来, anint
将是此定义下的函数。我错过了什么?
Ayx*_*xan 78
让我们回顾一下出现的条件:
Ifconst T
不是 const (const
实际上不适用于函数类型,因为函数不是对象),并且T
不是引用(const
出于同样的原因,也不适用于引用) ,它是一个函数类型。int
(或任何其他非函数非引用类型)不适合,因为is_const<const int>::value
is true
。
根据C++17 标准 §11.3.5 函数/第 7 节:(重点是我的)
函数声明器中 cv-qualifier-seq 的效果与在函数类型之上添加 cv-qualification 不同。在后一种情况下,忽略 cv 限定符。[ 注意:具有 cv-qualifier-seq 的函数类型不是 cv 限定类型;没有 cv 限定的函数类型。- 尾注] [...]
Bri*_*ian 58
语言中只有两类类型不能具有 const 限定:引用类型和函数类型。因此,如果const T
不能是 const 限定类型,则意味着T
要么是函数类型,要么是引用类型。如果您可以排除引用类型,那么您将只剩下函数类型。
请注意,带有 cv 限定符的函数类型(例如int(int) const
)不是const 限定类型。这是一个“可恶的函数类型”的例子,它唯一的真正用途是组合或分解指向成员函数的指针类型。类型int(int) const
不能由上的顶部添加常量资格来获得int(int)
。相反,const
应用于隐含的对象参数。
归档时间: |
|
查看次数: |
6212 次 |
最近记录: |