2

在以下设置中是否有可能

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

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

check会回来true一些T吗?这是否取决于内部正在做什么id?标准对此有何规定?

4

2 回答 2

7

当然。尝试const intint&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 限定符。

于 2012-09-30T11:29:03.463 回答
0

我希望这些功能是不相等的。该标准绝对不要求它们相同,尽管我怀疑它允许它们相同(我不太知道在哪里寻找相应的子句)。

于 2012-09-30T11:32:05.843 回答