c++ - 带有 std::quoted 的 Visual Studio 中的错误

标签 c++ visual-studio-2017 language-lawyer

只是确保它确实是一个错误,而不是我可能误解了 std::quoted 的功能。

这是我认为应该用双引号转义双引号然后将它们转义回原始字符串的代码:

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>

int main()
{
    std::string s = R"(something"something)";
    std::cout << "Original: \t" << s << std::endl;

    std::ostringstream oss;
    oss << std::quoted(s, '"', '"');
    std::string s1 = oss.str();
    std::cout << "Quoted: \t" << s1 << std::endl;

    std::istringstream iss(s1);
    std::string s2;
    iss >> std::quoted(s2, '"', '"');
    std::cout << "Unquoted: \t" << s2 << std::endl;

    return 0;
}

预期输出:

Original:   something"something
Quoted:     "something""something"
Unquoted:   something"something

但是这是我在 VS2017 15.6.6 中得到的:

Original:   something"something
Quoted:     "something""something"
Unquoted:   something

谁能确认这是一个错误?

更新:

大家好消息。 ticket I filed with MS被标记为fixed

最佳答案

在进一步研究这个问题后,我想回答我自己的问题。感谢@Justin 和@MatteoItalia 的富有洞察力的评论。简而言之,这不是错误,而是未定义的行为,因为 VC++ 似乎遵循 standard到点为止,而其他编译器则随意以自己的方式解释它,因为对于如何处理 delim == escape 的情况没有严格的指导方针,而这 paragraph不解释:

Until an unescaped delim character is reached or !in, extract characters from in and append them to s, except that if an escape is reached, ignore it and append the next character to s.

这正是 VC++ 发生的事情,something 之后的第一个双引号 " 被解释为未转义的分隔符而不是转义符,这会终止例程。IMO它需要澄清,例如:如果找到转义字符,请检查它是否后跟 delim 字符,如果是,则丢弃转义字符。我认为是 original proposal

我已提交 report在 MS 错误跟踪器上,但对修复 TBH 的希望不大。然后我找到了this ticket @Barry 建议使用现有实现 herehere来自 GCC,这正是我所做的。

这对我来说按预期工作,但如果您有任何疑虑或建议,请分享。

关于c++ - 带有 std::quoted 的 Visual Studio 中的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50048252/

相关文章:

c++ - 使用 wineg++/winelib 编译 C++ 程序的问题

c++ - 在 OpenMP 中并行化嵌套循环并使用更多线程执行内循环

c++ - C++ 中有标准的日期/时间类吗?

c# - 右键单击部署时如何运行 --publish-local-settings?

visual-studio - 相当于 dotnet core/csproj 中的 AssemblyInfo

c++ - 为什么要为未删除的对象调用析构函数?

C++11 引入了标准化的内存模型。这是什么意思?它将如何影响 C++ 编程?

c++ - 为什么现有函数参数不能用于评估其他默认参数?

c++ - NULL 函数指针

task - Visual Studio 2017 Task Runner Explorer无法在发布上运行事件