簡體   English   中英

使用Visual Studio 2012代碼分析的錯誤C2248

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM