在以下设置中是否有可能
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 限定符。
我希望这些功能是不相等的。该标准绝对不要求它们相同,尽管我怀疑它允许它们相同(我不太知道在哪里寻找相应的子句)。