【发布时间】:2016-10-05 09:59:59
【问题描述】:
美好的一天,
我在 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 中,当我在向量中打印第一个字符串时,它在最后一行崩溃。
当我尝试调试它时,我发现变量 myVector 被“优化掉并且不可用”。在发布。我认为这不是正确的优化。
我还发现,如果我把一行改成这样:for (const auto& line : getLineByLine("fileWithMoreThanOneLine.txt", [&myVector](std::string& var) { return var; }))
它编译正确。但是 lambda 函数中不需要变量 myVector 对吧?
这是我的代码或 MSVC 编译器的问题吗?我尝试了 VS 2015 Update 1(第一个带有协程的 VS)和 VS“15”,每天构建 VC++。
谢谢你,
Miroslav Hrnčíř
附:我很抱歉我的英语不好,如果这是一个愚蠢的问题。
【问题讨论】:
-
什么是
program? -
而且在您当前的代码中,您永远不会将任何内容推送到
myVector -
抱歉,程序是 myVector 的原始名称 :(
-
听起来这可能是 MSVC 中的一个问题。只是好奇,如果您将循环更改为
for (auto line : getLineByLine("fileWithMoreThanOneLine.txt"))会怎样?我认为getLineByLine返回一个临时的,虽然一个 const ref 不应该根据标准引起问题,也许它是? -
@AndyG 好主意,但这不是问题。
标签: c++ visual-c++ visual-studio-2015 coroutine