Kil*_*Kid 14 c++ language-lawyer visual-studio-2017
只是确保它确实是一个错误,而不是我可能误解了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;
}
Run Code Online (Sandbox Code Playgroud)
预期产量:
Original: something"something
Quoted: "something""something"
Unquoted: something"something
Run Code Online (Sandbox Code Playgroud)
然而,这是我在VS2017 15.6.6中得到的:
Original: something"something
Quoted: "something""something"
Unquoted: something
Run Code Online (Sandbox Code Playgroud)
谁能证实这是一个错误?
更新:
在进一步研究这个问题后,我想回答我自己的问题.感谢@Justin和@MatteoItalia的深刻见解.简而言之,这不是一个错误,而是一个未定义的行为,因为VC++似乎遵循标准的点,而其他编译器采取自由来解释它以自己的方式,因为没有严格的指导如何处理案例delim == escape,本段不解释:
在到达未转义的delim字符或!in之前,从in中提取字符并将它们附加到s,除非如果到达转义符,则忽略它并将下一个字符追加到s.
这正是VC++发生的事情,"后面的第一个双引号something被解释为未转义的delim字符而不是转义字符,它终止例程.IMO它需要澄清,例如:如果找到转义字符,检查它是否后跟delim字符,如果是,则丢弃转义字符.我认为这是原始提案.
我已经在MS bug跟踪器上提交了一份报告,但对修复TBH没有多大希望.然后我发现这张票,其中@Barry建议使用现有的实现在这里和这里从GCC,而这正是我所做的.
这对我来说是预期的,但如果您有任何疑虑或建议,请分享.
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |