Подтвердить что ты не робот

Не можете использовать "не", "или" или "плюс" в качестве идентификатора?

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

enum class conditional_operator { plus, or, not };

Но, по-видимому, GCC (4.6) считает, что это специальные, в то время как я не могу найти стандарт, который говорит, что они (ни С++ 0x n3290, ни C99 n2794). Я компилирую с g++ -pedantic -std=c++0x. Является ли это компилятором? Как отключить его? Не следует ли -std=c++0x отключить эту функцию?

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

4b9b3361

Ответ 1

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

Существует множество других альтернативных токенов BTW.

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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