Когда "и" стал оператором в С++

У меня есть код, который выглядит так:

static const std::string and(" AND ");

Это приводит к ошибке в g++, например:

Row.cpp:140: error: expected unqualified-id before '&&' token

поэтому после проклятия дурака, который определил "и" как & &, я добавил

#ifdef and
#undef and
#endif

и теперь я получаю

Row.cpp:9:8: error: "and" cannot be used as a macro name as it is an operator in C++

Что приводит к моему вопросу о том, КОГДА "и" стал оператором на С++? Я не могу найти ничего, что указывает на это, за исключением, конечно, этого сообщения из g++

Ответ 2

Из стандарта С++ 03, раздел 2.5:

2.5 Альтернативные жетоны

Для некоторых операторов и пунктуаторов предусмотрены альтернативные представления токенов. Во всех аспектах языка каждый альтернативный токен ведет себя одинаково, соответственно, как основной маркер, за исключением его орфографии. Набор альтернативных токенов определен в таблице 2.

Таблица 2 - альтернативные маркеры

alternative primary 
  <%         { 
  %>         } 
  <:         [ 
  :>         ] 
  %:         # 
  %:%:       ## 
  and        && 
  bitor      | 
  or         || 
  xor        ˆ 
  compl      ˜ 
  bitand     & 
  and_eq     &= 
  or_eq      |= 
  xor_eq     ˆ= 
  not        ! 
  not_eq     != 

Ответ 3

Они были там с С++ 98. Они перечислены в стандарте §2.5/2 (издание 1998 или 2003 года). Альтернативные маркеры включают в себя: and, or, xor, not, bitand, bitor, compl, and_eq, or_eq, xor_eq, not, not_eq.

Ответ 4

Вы можете использовать -fno-operator-names, чтобы отключить это. Кроме того, вы можете называть свой объект std::string чем-то другим!

Ответ 5

В соответствии со стандартом С++ 2.12 существуют предопределенные токены препроцессора, которые используются в синтаксис препроцессора или преобразовываются в токены для операторов и пунктуаторов. "and - один из них. В новом стандарте С++ есть новый 2.12/2:

Кроме того, альтернативные представления, показанные в таблице 4 для некоторых операторов и пунктуаторов (2.6) , зарезервированы и не будут использоваться иначе:

and and_eq bitand bitor compl not
not_eq or or_eq xor xor_eq

Ответ 6

Я не знаю, когда это было введено, возможно, это было с самого начала, но я считаю, что причина, по которой она существует, является альтернативой && для людей с ограниченными наборами символов, т.е. там, где они не имеют характер амперсанда.

Есть и многие другие, например. and_eq, or, compl и not, чтобы назвать только выбор.

Ответ 7

Они были добавлены, потому что некоторые из этих символов трудно напечатать на некоторых клавиатурах.