Ошибка 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:
«Станд :: basic_ifstream<_Elem, _Traits> :: basic_ifstream ‘: невозможно получить доступ
закрытый член объявлен в классе ‘std :: basic_ifstream<_Elem, _Traits>»
с
[
_Elem = символ,
_Traits = станд :: char_traits
] при проверке этого исключенного конструктора копирования ‘std :: basic_ifstream<_Elem, _Traits> :: basic_ifstream (Const
станд :: basic_ifstream<_Elem, _Traits> &) ‘вызывается
с
[
_Elem = символ,
_Traits = станд :: char_traits
] C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ include \ fstream (827): см. Объявление ‘std :: basic_ifstream<_Elem, _Traits> :: basic_ifstream»
с
[
_Elem = символ,
_Traits = станд :: char_traits
] при конвертации из ‘std :: basic_ifstream<_Elem, _Traits> ‘to’ std :: basic_ifstream<_Elem, _Traits> &&’
с
[
_Elem = символ,
_Traits = станд :: char_traits
]

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

0

Решение

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

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

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

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

std::ifstream inputFile(m_filename);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector