Почему std::string s ( "?? <" ) выводит a {вместо <<как ожидалось?

std::string s("??<");
std::cout << s << std::endl;

Почему этот вывод {вместо <<

Я использую Visual Studio 2008. Я предполагаю, что он кодирует его, но почему и что называется кодировкой, если это происходит?

Этот маленький% # $^ *! заставил меня искать ошибку в моем (unit test) коде в течение 30 минут, прежде чем я понял, что моя строка искалечена!!: (

Ответ 1

Из-за trigraphs.

Это поддерживаемые триграфы со страницы Википедии:

  • ??=#
  • ??/\
  • ??'^
  • ??([
  • ??)]
  • ??!|
  • ??<{
  • ??>}
  • ??-~

Для Visual Studio в соответствии с триггеры документации отключены по умолчанию (достаточно разумно), поэтому проверьте свой проект /make файлы.