次の設定でそれが可能なことはありますか
template <typename T>
inline void id() {
//...
}
template <typename T>
bool check() {
return &id<T> == &id<T const>;
}
checktrueいくつかのために戻ってきますかT?内部で何が行われているかに依存しますidか?規格はこれについて何を言わなければなりませんか?
次の設定でそれが可能なことはありますか
template <typename T>
inline void id() {
//...
}
template <typename T>
bool check() {
return &id<T> == &id<T const>;
}
checktrueいくつかのために戻ってきますかT?内部で何が行われているかに依存しますidか?規格はこれについて何を言わなければなりませんか?
もちろん。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 修飾子は無視されます。
機能が等しくないことを期待します。標準では、それらが同一である必要はありませんが、同一であることが許可されていると思います(対応する句をどこで探すべきかわかりません)。