私はいくつかの古いコード(現在32ビットビルドで動作しているMSVC 2005を使用する必要があります)の警告を取り除くことを試みてきましたが、変換警告を取り除くのにsize_t
苦労unsigned int
しています。成長するアレイの独自のArray<T>
実装があり、
template<typename I> const T& at(const I i) const {return atImpl(i);}
方法。と呼ばれるとき
size_t i = 10; myArray.at(i);
conversion from 'size_t' to 'const unsigned int', possible loss of data
警告が表示されます。動作理論は、であるとI
理解されておりunsigned int
、これにより、コンパイラはに渡すときにをキャスト/変換しsize_t
ます(これは不便ですが許容できます)。ただし、最小限の作業例(この投稿の下部)でも、より複雑な最小限の例でも、この警告を再現することはできませんでした。パラメータをキャストするだけで警告が消え、私たちのニーズには十分です(契約により、数はに収まります)unsigned int
i
at
unsigned int
unsigned int
I
そのような呼び出しに参加することについての私の理解はunsigned int
正しいですか(specは「typedef-nameは別のタイプの同義語です。typedef-nameは新しいタイプを導入しません」とtypeid(size_t(1)).name()
言ってunsigned int
おり、フィードされているようです)size_t
。typedef
言い換えれば、最小限の例で警告を出すべきかどうか。私の知る限り、ビルド構成は同じです。- 私たちのコードは警告を出しますが、最小限の例はそうではないので、私が見落としているに違いないことがあります。あらゆる努力にもかかわらず、私は何を理解することができません。アイデア?
ありがとう
最小限の例:
template<typename T>
class A
{
int t;
public:
template<typename I> T& at(const I i) { return t;}
};
int main()
{
size_t i = 10;
A<int> a;
a.at(i) = 5; // no warning, why?
return 0;
}