我试图编译这个:
enum class conditional_operator { plus, or, not };
但显然GCC(4.6)认为这些是特殊的,而我找不到一个说它们的标准(C ++ 0x n3290或C99 n2794)。我正在使用g++ -pedantic -std=c++0x
进行编译。这是编译器的便利吗?我该如何关闭它?不应-std=c++0x
关闭此“功能”吗?
答案 0 :(得分:15)
看看2.5。它们是||
和!
的替代令牌。
还有一堆其他替代令牌BTW。
编辑:包含它们的基本原理与三字符相同:允许使用非ASCII字符集。该委员会已经试图摆脱它们(至少是三元组,我不记得替代令牌),并且遇到了使用它们的人(主要是IBM大型机用户)的反对。
编辑完整性:正如其他人发表评论一样,加上不在该课程中,除非你是using namespace std
,否则不应该成为问题。
答案 1 :(得分:7)
这些实际上是defined as alternative tokens(并且保留)奇怪,作为运算符的替代表示。我相信这最初是为了帮助那些使用键盘使得相关符号难以制作的人,尽管这似乎是在语言中添加额外关键词的一个非常糟糕的理由:(
可能是一个GCC编译器选项来禁用它们,但我不确定。
(如评论中所述,除非您使用plus
命名空间,否则std
应该没问题。)
答案 2 :(得分:5)
or
和not
分别是||
和!
的替代表示。你无法关闭它们,你不能将这些令牌用于其他任何东西,它们是语言的一部分(当前的C ++,甚至不仅仅是C ++ 0x)。 (见ISO / IEC 14882:2003 2.5 [lex.digraph]和2.11 [lex.key] / 2.)
除非您使用plus
或using namespace std;
,否则您应该using std::plus;
安全。
答案 3 :(得分:1)
标准列出了2.11中的关键字。还有一个与保留的关键字列表分开的替代表示列表,否则不能使用,但不是关键字。 and
和or
列在该列表中。第17.4.3节描述了对使用库的程序的限制,17.4.3.1.3描述了在标题中使用外部链接声明的名称在std::
和全局名称空间中保留。
换句话说,您不必转到C ++ 0x就可以解决这些问题。 and
和or
已被保留,标头<functional>
包含plus
作为模板化结构类型,plus
因此<functional>
是禁止的}直接或间接#include
d。
我不确定在全局命名空间中倾倒那么多东西是非常明智的,但这就是标准所说的。
答案 4 :(得分:1)