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;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はすでに予約されており、ヘッダーにはテンプレート化された構造体タイプが含まれている<functional>ため、が直接的または間接的にある場合は立ち入り禁止です。plusplus<functional>#include

グローバル名前空間にそれほど多くのものをダンプすることが本当に賢明だったかどうかはわかりませんが、それは標準が言っていることです。

于 2011-06-06T14:29:19.687 に答える
1

これは、1995年のC90規格の修正です。おそらく、コンパイラはこれに対してどのように動作するかを選択するかもしれません。GCCには、おそらく標準ライブラリの一部としてヘッダーが含まれています。マイクロソフトではそうではなく、iso646.hを含める必要があります。

これに関するウィキペディアへのリンクは次のとおりです。

于 2011-06-06T14:32:42.173 に答える