1

私は現在 PC-Lint (バージョン 9.00j および l) に取り組んでおり、コードの一部に対していくつかのエラーと警告が表示されます。コードは適切にコンパイルされ、期待どおりに実行されます。これを簡略化したバージョンを次に示します。

#include <iostream>
#include <vector>

typedef unsigned char uint8_t;

class Test
{
  uint8_t          inputList[10];
  std::vector<int> resultList;

public:

  Test() : resultList()
  {
    for (uint8_t ii = 0; ii < 10; ++ii) 
      inputList[ii] = ii;
  }

  template<int list_size, typename ResultListType>
  void loadList(const uint8_t (& inputList)[list_size],
                ResultListType & resultList) const
  {
    for (uint8_t ii = 0; ii < list_size; ++ii) 
      resultList.push_back(inputList[ii]);
  }

  void run()
  {
    loadList(inputList, resultList);
  }

  void print()
  {
    std::vector<int>::iterator it;
    for (it = resultList.begin(); it != resultList.end(); ++it)
      std::cout << *it << std::endl;
  }
};

int main()
{
  Test t;
  t.run();
  t.print();
}

これを Gimpel のオンライン デモで実行すると、次のエラーと警告が表示されます。

    30      loadList(inputList, resultList);
diy.cpp  30  Error 1025:  No template matches invocation 'Test::loadList(unsigned char [10], std::vector<int>)', 1 candidates found, 1 matched the argument count
diy.cpp  30  Info 1703:  Function 'Test::loadList(const unsigned char (&)[V], <2>&) const' arbitrarily selected. Refer to Error 1025
diy.cpp  30  Error 1032:  Member 'loadList' cannot be called without object
diy.cpp  30  Error 1058:  While calling 'Test::loadList(const unsigned char (&)[V], <2>&) const': Initializing a non-const reference '<2>&' with a non-lvalue (a temporary object of type 'std::vector<int>')
diy.cpp  30  Warning 1514:  Creating temporary to copy 'std::vector<int>' to '<2>&' (context: arg. no. 2)

したがって、基本的に、PC-Lint は正しいテンプレート パラメータを偶然見つけて、ベクトルの一時的なコピーだけが埋められることを伝えようとしています。しかし、コードはうまく動作し、resultList にはデータが含まれています!

ここで何が起こっているのか誰か教えてもらえますか? PC-Lint は正しく、何かがうまくいかないのか、それとも単なる PC-Lint のバグなのか?

4

1 に答える 1

0

問題は、loadListとマークされているにもかかわらず、変更するconstメンバー変数に非定数参照を渡すresultListことです。

関数がインスタンスを直接loadList変更しないのは事実ですが、メンバー変数を変更するため、関数を定数にすることはできません。this

関数に渡す一時的なベクトルを作成するか、関数を not にしconstます。

于 2016-03-30T11:24:59.323 に答える