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