模板函数实例的地址超过T和T const

yur*_*hek 2 c++ function-pointers instantiation function-templates

是否有可能在以下设置中

template <typename T>
inline void id() {
    //...
}

template <typename T>
bool check() {
    return &id<T> == &id<T const>;
}
Run Code Online (Sandbox Code Playgroud)

check会回来true一些T吗?它取决于内部的工作id吗?标准对此有何看法?

Joh*_*itb 7

当然.尝试const intint&void().


如果你通过一个或一个模板参数获得多个顶级const限定符,那么顶级限定符就会崩溃typedef,这意味着check<int const>()将返回true.

[规范性文本待定]

然后有一条规则忽略了const它无法处理的事物的顶级,比如引用或函数类型.这意味着check<int&>check<int()>返回true.

§8.3.2 [dcl.ref] p1

除非通过使用typedef(7.1.3)或模板类型参数(14.3)引入cv限定符,否则Cv限定引用的格式不正确,在这种情况下,cv限定符将被忽略.

§4.4 [conv.qual] p3

[ 注意:函数类型(包括指向成员函数类型的指针)绝不是cv限定的(8.3.5).- 尾注 ]

§8.5.3 [dcl.fct] p6

一的效果CV-限定符-SEQ的函数声明是不一样的功能类型的顶部上添加CV-资格.在后一种情况下,忽略cv限定符.