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

时间:2012-09-30 11:21:36

标签: c++ function-pointers instantiation function-templates

是否有可能在以下设置中

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

template <typename T>
bool check() {
    return &id<T> == &id<T const>;
}
对于某些check

true会返回T吗?它取决于id内的内容吗?该标准对此有何意见?

2 个答案:

答案 0 :(得分: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)。 -end note ]

§8.5.3 [dcl.fct] p6

  

cv-qualifier-seq 在函数声明符中的作用与在函数类型之上添加cv-qualification不同。 在后一种情况下,将忽略cv限定符。

答案 1 :(得分:0)

我希望这些功能是不相等的。标准肯定要求它们相同但我怀疑它允许它们相同(我不知道在哪里寻找相应的子句)。