Не можете использовать «не», «или» или «плюс» в качестве идентификатора? - PullRequest
12 голосов
/ 06 июня 2011

Я пытался скомпилировать это:

enum class conditional_operator { plus, or, not };

Но, очевидно, GCC (4.6) считает, что они особенные, хотя я не могу найти стандарт, который говорит, что они (ни C ++ 0x n3290, ни C99n2794).Я компилирую с g++ -pedantic -std=c++0x.Это удобство компилятора?Как мне его выключить?Разве -std=c++0x не должен отключить эту «функцию»?

PS: Хммм, очевидно, форматирование кода MarkDown тоже так думает ...

Ответы [ 5 ]

15 голосов
/ 06 июня 2011

Посмотрите на 2.5. Это альтернативные токены для || и !.

Кстати, есть куча других альтернативных токенов.

Редактировать: Основание для их включения такое же, как и в триграфах: разрешить использование наборов символов, не относящихся к ASCII. Комитет попытался избавиться от них (по крайней мере, от триграфов, я не помню альтернативных токенов) и встретил сопротивление людей (в основном пользователей мэйнфреймов IBM), которые их используют.

Отредактируйте для полноты: как другие делают замечания, плюс не в этом классе и не должно быть проблемой, если вы не using namespace std.

7 голосов
/ 06 июня 2011

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

Там может быть опцией компилятора GCC, чтобы отключить их, но я не уверен.

(Как уже упоминалось в комментариях, plus должно быть в порядке, если вы не используете пространство имен std.)

5 голосов
/ 06 июня 2011

or и not являются альтернативными представлениями || и ! соответственно.Вы не можете отключить их, и вы не можете использовать эти токены для чего-то еще, они являются частью языка (текущий C ++, даже не только C ++ 0x).(См. ИСО / МЭК 14882: 2003 2.5 [lex.digraph] и 2.11 [lex.key] / 2.)

Вы должны быть в безопасности с plus, если не используете using namespace std; или using std::plus;.

1 голос
/ 06 июня 2011

Это поправка 1995 года к стандарту C90. Вероятно, компилятор может выбрать, как вести себя в этом направлении. GCC, вероятно, включает заголовок как часть стандартной библиотеки. С Microsoft это не так, и вы должны включить iso646.h .

Вот ссылка на википедию по этому поводу.

1 голос
/ 06 июня 2011

Стандарт перечисляет ключевые слова в 2.11. Есть также список альтернативных представлений, отдельный от списка ключевых слов, который зарезервирован и не может использоваться иначе, но не является ключевыми словами. and и or находятся в этом списке. Раздел 17.4.3 описывает ограничения для программ, которые используют библиотеки, а 17.4.3.1.3 описывает, что имена, объявленные с внешней связью в заголовке, зарезервированы как в std::, так и в глобальном пространстве имен.

Другими словами, вам не нужно переходить на C ++ 0x, чтобы иметь такие проблемы. and и or уже зарезервированы, а заголовок <functional> содержит plus в качестве шаблонного типа структуры, и поэтому plus запрещен, если <functional> прямо или косвенно #include d.

Я не уверен, что вывод такого большого количества материала в глобальное пространство имен был действительно мудрым, но это то, что говорит стандарт.

...