2

次の設定でそれが可能なことはありますか

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

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

checktrueいくつかのために戻ってきますかT?内部で何が行われているかに依存しますidか?規格はこれについて何を言わなければなりませんか?

4

2 に答える 2

7

もちろん。const intまたはint&またはを試してくださいvoid()


または テンプレート引数を介して複数の修飾子を取得すると、トップレベルのconst修飾子が折りたたまれるというルールがあります。つまり、が返されます。typedefcheck<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 に答える