[英]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.