4

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

  1. Iそのような呼び出しに参加することについての私の理解はunsigned int正しいですか(specは「typedef-nameは別のタイプの同義語です。typedef-nameは新しいタイプを導入しません」とtypeid(size_t(1)).name()言ってunsigned int おり、フィードされているようです)size_ttypedef言い換えれば、最小限の例で警告を出すべきかどうか。私の知る限り、ビルド構成は同じです。
  2. 私たちのコードは警告を出しますが、最小限の例はそうではないので、私が見落としているに違いないことがあります。あらゆる努力にもかかわらず、私は何を理解することができません。アイデア?

ありがとう

最小限の例:

    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;
    }
4

1 に答える 1

2

at関数もテンプレート化されています。C ++は、テンプレートタイプの引数を推測しようとします。a.at <size_t>(1)などの呼び出しでタイプを指定していないため、コードで何が起こっているかを示します。

このコードは、型をunsigned intと推定し、size_tを渡そうとするため、警告を生成します。

template <typename T>
class A
{
    int t;
    public:
        template<typename I> T& at(const I i)
        { return t;}
};

int main()
{
    unsigned int j = 5;
    size_t i = 10;
    A<int> a;

    a.at(j) = 4; // deduce template type as unsigned int
    a.at(i) = 5; // generate warning
    return 0;
}

編集:私は実際にVSでこのコードを試しましたが、警告が生成されます。

Edit2:私が試したコードでは、size_tとunsignedintも両方とも4バイトです。だから私はいくつか掘りました。古いバージョンのVSでは、size_tは次typedef __w64 unsigned int size_t のように定義されています。「__ w64」は非推奨になりましたが、64ビットプラットフォームに移行するときにサイズが異なるタイプ(64と32など)にフラグを立てるために使用されていました。__w64により、コンパイラsize_tは別のタイプとして認識されます。

実験として、私は自分のunsigned intをtypedefし、行をにmyint変更しました。size_t i = 10myint i = 10

usingtypedef __w64 unsigned int myintは警告を生成しますが、'typedef unsignedintmyint`は警告を生成しません。

于 2012-03-20T12:40:38.743 に答える