私はいくつかの古いコード(現在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 intiatunsigned intunsigned 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;
}