gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:41:21 32 4
gpt4 key购买 nike

只是确保它确实是一个错误,而不是我可能误解了 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com