使用Visual Studio 2012代码分析时出现错误C2248

时间:2013-11-23 16:42:03

标签: c++ visual-studio-2012 c++11 code-analysis static-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&lt; _Elem,_Traits&gt; :: basic_ifstream':无法访问   在类'std :: basic_ifstream&lt; _Elem,_Traits&gt;'中声明的私有成员             同             [                 _Elem =炭,                 _Traits =标准:: char_traits             ]             同时检查elided拷贝构造函数'std :: basic_ifstream&lt; _Elem,_Traits&gt; :: basic_ifstream(const   的std :: basic_ifstream&LT; _Elem,_Traits&GT; &amp;)'可以调用             同             [                 _Elem =炭,                 _Traits =标准:: char_traits             ]             C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ include \ fstream(827):参见'std :: basic_ifstream&lt; _Elem,_Traits&gt; :: basic_ifstream'的声明             同             [                 _Elem =炭,                 _Traits =标准:: char_traits             ]             从'std :: basic_ifstream&lt; _Elem,_Traits&gt;'转换时到'std :: basic_ifstream&lt; _Elem,_Traits&gt; &安培;&安培;”             同             [                 _Elem =炭,                 _Traits =标准:: char_traits             ]

如果我没有运行代码分析,则不会触发错误消息。什么特定检查会触发此错误,是否可以禁用它以便分析可以在我的代码上完成?

1 个答案:

答案 0 :(得分:1)

我不相信流应该是可复制的。但是,这条线可能正是这样做的。如上所述,它应构造一个临时的std :: ifstream,然后使用它来复制构造inputFile。

显然,普通编译器会优化复制构造,以便该行最终直接构造inputFile。显然,这是在绕过任何关于是否允许复制构造的检查。

显然,代码分析会进行更彻底的检查并发现差异。

由于没有理由首先构建临时的ifstream,你只需将该行重写为:

std::ifstream inputFile(m_filename);
相关问题