Ошибка C2248 при использовании анализа кода Visual Studio 2012

При попытке запустить анализатор кода Visual Studio 2012 для этой функции я обнаружил ошибку C2248 в первой строке функции:

void InputFile::parseInputFile()
{
    auto inputFile = std::ifstream(m_filename); // error occurs on this line
    if (inputFile.is_open())
    {
        const auto fileBegin = std::istreambuf_iterator<char>(inputFile);
        const auto fileEnd   = std::istreambuf_iterator<char>();

        const auto fileContents = std::string(fileBegin, fileEnd);
        m_sectors.reserve(std::count(std::begin(fileContents), std::end(fileContents), '\n'));

        const auto lineTokenizer = boost::tokenizer<boost::char_separator<char>>(fileContents, boost::char_separator<char>("\n"));
        const auto symbolSeparator = boost::char_separator<char>(" ");

        std::transform(std::begin(lineTokenizer), std::end(lineTokenizer), std::back_inserter(m_sectors), 
            [=](const std::string& line) 
        {
            const auto symbolTokenizer = boost::tokenizer<boost::char_separator<char>>(line, symbolSeparator);

            std::vector<std::string> symbols;
            symbols.reserve(std::count(std::begin(line), std::end(line), ' '));
            std::copy(std::begin(symbolTokenizer), std::end(symbolTokenizer), std::back_inserter(symbols));
            return symbols;
        });
    }
}

Полное сообщение об ошибке приведено ниже:

ParseInput.cpp (24): ошибка C2248: 'std :: basic_ifstream ‹_Elem, _Traits> :: basic_ifstream': невозможно получить доступ к закрытому члену, объявленному в классе 'std :: basic_ifstream‹ _Elem, _Traits>' с [_Elem = char, _Traits = std :: char_traits] при проверке того, что пропущенный конструктор копирования 'std :: basic_ifstream ‹_Elem, _Traits> :: basic_ifstream (const std :: basic_ifstream‹ _Elem, _Traits> &)' вызывается с помощью [_Elem = char, _Traits = std :: char_traits] C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ include \ fstream (827): см. объявление 'std :: basic_ifstream ‹_Elem, _Traits> :: basic_ifstream' с [_Elem = char , _Traits = std :: char_traits] при преобразовании из 'std :: basic_ifstream ‹_Elem, _Traits>' в 'std :: basic_ifstream‹ _Elem, _Traits> &&' с [ _Elem = char, _Traits = std :: char_traits]

Сообщение об ошибке не появляется, если я не выполняю анализ кода. Какая конкретная проверка вызывает эту ошибку, и можно ли отключить ее, чтобы можно было выполнить анализ моего кода?


person masrtis    schedule 23.11.2013    source источник


Ответы (1)


Я не верю, что потоки должны быть копируемыми. Однако рассматриваемая линия потенциально делает именно это. Как написано, он должен создать временный std :: ifstream, а затем скопировать-конструкцию inputFile, используя его.

По-видимому, обычный компилятор оптимизирует копирующую конструкцию, так что строка заканчивается прямым построением inputFile. И, по-видимому, это игнорирует любую проверку того, было ли вообще разрешено копирование.

Очевидно, анализ кода делает более тщательную проверку и выявляет несоответствия.

Поскольку в первую очередь нет причин создавать временный ifstream, вы можете просто переписать строку как:

std::ifstream inputFile(m_filename);
person TheUndeadFish    schedule 23.11.2013