12

我试图编译这个:

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 代码格式也是这么想的……

4

5 回答 5

15

看2.5。它们是||和的替代标记!

顺便说一句,还有很多其他替代代币。

编辑:包含它们的理由与三元组之一相同:允许使用非 ASCII 字符集。委员会试图摆脱它们(至少是三元组,我不记得替代令牌),并且遇到了使用它们的人(主要是 IBM 大型机用户)的反对。

编辑完整性:正如其他人所说,加号不在该课程中,除非您是using namespace std.

于 2011-06-06T14:17:17.947 回答
7

这些实际上被定义为替代标记(和保留),奇怪的是,作为运算符的替代表示。我相信这最初是为了帮助那些使用键盘的人,这使得相关符号难以产生,尽管这似乎是向语言添加额外关键字的一个非常糟糕的理由:(

可能有一个 GCC 编译器选项可以禁用它们,但我不确定。

(如评论中所述,plus除非您使用std命名空间,否则应该没问题。)

于 2011-06-06T14:16:24.763 回答
5

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;

于 2011-06-06T14:20:50.757 回答
1

该标准在 2.11 中列出了关键字。还有一个与保留的关键字列表分开的替代表示列表,不能以其他方式使用,但不是关键字。 and并且or在那个名单上。第 17.4.3 节描述了对使用库的程序的限制,第 17.4.3.1.3 节描述了在标头中使用外部链接声明std::的名称在全局名称空间和全局名称空间中都保留。

换句话说,你不必去 C++0x 来解决这些问题。 and并且or已经被保留,并且 header<functional>包含plus作为模板结构类型,plus因此如果<functional>是直接或间接的,则不受限制#included。

我不确定将这么多东西转储到全局命名空间中是否真的很明智,但这就是标准所说的。

于 2011-06-06T14:29:19.687 回答
1

它是 1995 年对 C90 标准的修订。编译器可能会选择如何处理这个问题。GCC 可能包含标头作为标准库的一部分。使用 microsoft 它没有,您必须包含iso646.h

这是关于此的维基百科的链接。

于 2011-06-06T14:32:42.173 回答