template<typename T>
void f( T, const T ) {}
class A {};
voidOnStart()
{
A * const a = new A;
f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
template<typename T>
struct B {
void f( T, const T ) {}
};
class A {};
voidOnStart()
{
const A* a;
B<const A*> b;
b.f( a, a ); //нормально
}
だからいいんです。原理的に何が変わったのでしょうか?
template<typename T>
void f( T, const T ) {}
class A {};
voidOnStart()
{
const A *a;
f( a, a ); //error: 'a' - cannot convert from const pointer to nonconst pointer
}
なぜ両方がコンパイルされるべきなのか?
一般的に、私はテンプレートをほとんど使いません - 詳細を説明しませんでした - 直感的なレベルでしか説明できません。
2番目のケースでは、TをA*で直接置き換えることでうまくコンパイルできます。
1番目のケースでは、直接の置換はうまくいきませんが、冗長なパラメータT2を追加することができます - 添加すると正常にコンパイルされます - 添加しなくても正常です - それが冗長である理由です。
直感的には,constは型の一部であることもあれば,単なる識別子であることもあり,関数内部ではポインタはconstになる.
これはPrint(__FUNCSIG__)で実感できる。
コンパイルエラー
そうやってコンパイルしているのであって、オリジナル版はそうではないはずです。
なぜ?
だからいいんです。原理的に何が変わったのでしょうか?
根本的に何が変わったのでしょうか?
この差は大きいですそのために呼んだんでしょう。
コンパイラは、テンプレートの正しいバージョンを把握できないという意味でバグを起こします。明らかにそのように指示した。そして、それが功を奏している。
そして、それが功を奏している。
なぜ文字数を増やしたのか?
なぜ文字数を増やしたのか?
コンパイラがパターンの完全に動作可能なバージョンを推測しないことを示すため。
コンパイラがパターンの完全に動作可能なバージョンを推測していないことを示すため。
なぜ、そうする必要があるのでしょうか?ServiceDeskは自分で解決することができる
なぜ?