Ошибка в Visual Studio с std :: quoted - программирование
Подтвердить что ты не робот

Ошибка в Visual Studio с std :: quoted

Просто убедитесь, что это действительно ошибка, а не то, что я, возможно, неправильно понял о функциональности 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

Может ли кто-нибудь подтвердить, что это ошибка?

ОБНОВИТЬ:

Хорошая новость. Билет, который я подал в MS, получил как fixed.

4b9b3361

Ответ 1

После дальнейших исследований этой проблемы я хотел бы ответить на мой собственный вопрос. Спасибо @Justin и @MatteoItalia за проницательные комментарии. Короче говоря, это не ошибка, а скорее неопределенное поведение, поскольку VC++, похоже, соответствует стандарту для точки, в то время как другие компиляторы принимают вольности, чтобы интерпретировать его по-своему, потому что нет строгого руководства о том, как справляться с случаи delim == escape, и этот абзац не объясняет это:

До тех пор, пока не будет достигнут невидимый символ delim или! In, извлеките символы из и добавьте их в s, за исключением того, что если побег будет достигнут, проигнорируйте его и добавьте следующий символ в s.

Это именно то, что происходит с VC++, первая двойная кавычка " после того, как something интерпретируется как неэкранированный символ delim, а не escape-символ, который завершает процедуру. ИМО нуждается в уточнении, что-то вроде: Если найден escape-символ, проверьте, за ним следует делимитный характер, и если да, отбросьте escape-символ. Вот оригинальное предложение, которое я думаю.

Я отправил отчет на трекер MS, но не очень надеюсь на исправление TBH. Затем я нашел этот билет, где @Barry предлагает использовать существующую реализацию здесь и здесь из GCC, и это именно то, что я сделал.

Это работает как ожидалось для меня, но если у вас есть какие-либо проблемы или предложения, пожалуйста, разделите.