错误代码或协程编译错误

MSVC++ Bad code or compile error with coroutines

本文关键字:编译 错误 程编译 错误代码      更新时间:2023-10-16

大家好,
我正在尝试c++中的新事物,我发现在Visual Studio中的调试和发布配置给了我不同的结果。

#include <experimental/generator>
#include <fstream>
#include <functional>
#include <iostream>
#include <string>
#include <vector>

template <typename T = std::string>
auto getLineByLine(std::string filename, std::function<T(std::string&)> func = [](std::string& var) { return var; })
{
    std::ifstream infile(filename);
    std::string line;
    while (getline(infile, line))
    {
        yield func(line);
    }
}
int main()
{
    std::vector<std::string> myVector;
    for (const auto& line : getLineByLine("fileWithMoreThanOneLine.txt"))
    {
        myVector.push_back(line);
    }
    std::cout << myVector[0] << std::endl;
}

Debug中的这段代码按预期输出- fileWithMoreThanOneLine.txt文件中的一行。
但是在Release中,当我在vector中打印第一个字符串时,它在最后一行崩溃了。
当我试图调试它时,我发现变量myVector在发布中"被优化掉了,不可用"。我认为这不是正确的优化。

我还发现,如果我把一行改成这样:
for (const auto& line : getLineByLine("fileWithMoreThanOneLine.txt", [&myVector](std::string& var) { return var; }))
它可以正确编译。但是变量myVector在lambda函数中是不需要的,对吧?

是我的代码或MSVC编译器的问题?我尝试了VS 2015 Update 1(第一个带有协程的VS)和VS"15",每天构建vc++。

谢谢你,
Miroslav Hrnč我ř

注:我很抱歉我的英语不好,如果这是一个愚蠢的问题。

听起来像是文件路径的问题…您可能无法读取文件,导致vector未被填充,然后vector[0]超出了范围。

VS将发布版本和调试版本放在不同的目录中,这意味着当你运行调试版本时打开的文件不存在于你使用的相同的相对路径下。

尝试使用完整路径更新它,然后看看会发生什么