在以下设置中是否有可能
template <typename T>
inline void id() {
//...
}
template <typename T>
bool check() {
return &id<T> == &id<T const>;
}
check
会回来true
一些T
吗?这是否取决于内部正在做什么id
?标准对此有何规定?
在以下设置中是否有可能
template <typename T>
inline void id() {
//...
}
template <typename T>
bool check() {
return &id<T> == &id<T const>;
}
check
会回来true
一些T
吗?这是否取决于内部正在做什么id
?标准对此有何规定?
当然。尝试const int
或int&
或void()
。
如果您通过一个或一个模板参数获得多个顶级const
限定符,则有一条规则会崩溃typedef
,这意味着check<int const>()
将返回true
。
[规范性文本待定]
const
然后有一条规则会忽略它不起作用的事物的顶层,例如引用或函数类型。这意味着check<int&>
并将check<int()>
返回true
。
§8.3.2 [dcl.ref] p1
cv 限定引用格式错误,除非通过使用 typedef (7.1.3) 或模板类型参数 (14.3) 引入 cv 限定符,在这种情况下忽略 cv 限定符。
和
§4.4 [conv.qual] p3
[注意:函数类型(包括那些在指向成员函数类型的指针中使用的)永远不是 cv 限定的(8.3.5)。——尾注]
§8.5.3 [dcl.fct] p6
函数声明器中cv-qualifier-seq的效果与在函数类型之上添加 cv-qualification 不同。在后一种情况下,将忽略 cv 限定符。
我希望这些功能是不相等的。该标准绝对不要求它们相同,尽管我怀疑它允许它们相同(我不太知道在哪里寻找相应的子句)。