Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't use "not", "or", or "plus" as identifier?

I tried to compile this:

enum class conditional_operator { plus, or, not };

But apparently GCC (4.6) thinks these are special, while I can't find a standard that says they are (neither C++0x n3290 or C99 n2794). I'm compiling with g++ -pedantic -std=c++0x. Is this a compiler convenience? How do I turn it off? Shouldn't -std=c++0x turn this "feature" off?

PS: Hmmm, apparently, MarkDown code formatting thinks so too...

like image 981
rubenvb Avatar asked Jun 06 '11 14:06

rubenvb


3 Answers

Look at 2.5. They are alternative tokens for || and !.

There is a bunch of other alternative tokens BTW.

Edit: The rationale for their inclusion is the same as the one of trigraphs: allow the use of non ASCII character sets. The committee has tried to get rid of them (at least of trigraphs, I don't remember for alternative tokens), and has met opposition of people (mostly IBM mainframe users) which are using them.

Edit for completeness: as other have make the remarks, plus isn't in that class and should not be a problem unless you are using namespace std.

like image 165
AProgrammer Avatar answered Oct 22 '22 04:10

AProgrammer


These are actually defined as alternative tokens (and reserved) oddly enough, as alternative representations for operators. I believe this was originally to aid people who were using keyboards which made the relevant symbols hard to produce, although this seems a pretty poor reason to add extra keywords to the language :(

There may be a GCC compiler option to disable them, but I'm not sure.

(As mentioned in comments, plus should be okay unless you're using the std namespace.)

like image 7
Jon Skeet Avatar answered Oct 22 '22 04:10

Jon Skeet


or and not are alternative representations of || and ! respectively. You can't turn them off and you can't use these tokens for anything else, they are part of the language (current C++, not even just C++0x). ( See ISO/IEC 14882:2003 2.5 [lex.digraph] and 2.11 [lex.key] / 2. )

You should be safe with plus unless you use using namespace std; or using std::plus;.

like image 5
CB Bailey Avatar answered Oct 22 '22 02:10

CB Bailey