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