[英]Error C2248 using Visual Studio 2012 code analysis
尝试在此函数上运行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':无法使用[_Elem = char,_Traits访问类'std :: basic_ifstream <_Elem,_Traits>中声明的私有成员= std :: char_traits],同时检查是否可以使用[_Elem = char,_Traits =调用可忽略的复制构造函数'std :: basic_ifstream <_Elem,_Traits> :: basic_ifstream(const std :: basic_ifstream <_Elem,_Traits>&)' std :: char_traits] C:\\ Program Files(x86)\\ Microsoft Visual Studio 11.0 \\ VC \\ include \\ fstream(827):请参见带有[_Elem = char的'std :: basic_ifstream <_Elem,_Traits> :: basic_ifstream'的声明,使用[_Elem = char,_Traits = std :: char_traits]从'std :: basic_ifstream <_Elem,_Traits>'转换为'std :: basic_ifstream <_Elem,_Traits> &&'时,_Traits = std :: char_traits]
如果我没有运行代码分析,则不会触发该错误消息。 哪些特定的检查会触发此错误,是否可以将其禁用,以便对我的代码进行分析?
我不认为流应该是可复制的。 但是,有问题的生产线可能正在这样做。 如所写,它应该构造一个临时的std :: ifstream,然后使用它来复制构造inputFile。
显然,普通的编译器优化了复制构造,因此该行最终只是直接构造inputFile。 显然,这绕过了是否完全允许复制构造的任何检查。
显然,代码分析进行了更彻底的检查,并发现了差异。
由于没有理由首先构造一个临时的ifstream,因此您可以将其重写为:
std::ifstream inputFile(m_filename);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.