12

私はコーディングをしていて、定数参照とそのデフォルト値の間のスペースを誤って省略していました。Intellisenseでエラーとして表示されたのを見て驚いたので、コンパイルしました。確かに、GCC 4.3.4、4.5.1、または4.7.2では機能せず、 VisualStudio2012も。

エラーを示す同等のサンプルを次に示します。

struct S {
    S(const int &= 5){}    
};

int main(){}

これにより、GCCでは次のエラーが発生し、MSVCでは同様のエラーが発生します。

エラー:「&=」トークンの前に「、」または「...」が必要です

これは&=、が演算子として扱われているためだと思いますが、このケースに関する詳細情報を見つけるために、標準で何を検索すればよいか正確にはわかりません。&=は、オペレーター固有の情報を考え出すだけです。

興味があったので、右辺値の参照と交換することにしました。

S(int &&= 5){}

不思議なことに、これはGCC 4.7.2とMSVCの両方で正常にコンパイルされます。つまり、&=は常に演算子として字句的にペアになっているわけではありません。

なぜ左辺値参照ではなく右辺値参照で機能するのですか?また、標準はこの問題について何と言っているのですか?

4

2 に答える 2

14

これは一般に「最長一致の原則」または「最大のムンク」として知られています。&&は有効なトークンであり、そうで&&=はないため(の複合代入表記はありません) 、で始まる&&最長のトークンは;です。それが削除された後は、単一のトークンと見なされる機会はありません。&&=&&&=

この原則は多くの言語に共通していますが、例外もあります。たとえば、C ++ 11では、のようなコンテキストで次のように>>分析され>ます。>std::vector<std::vector<int>>

于 2012-11-29T21:03:31.710 に答える
6

パーサーは、結合性に関係なく、左から右に機能するため、最初の例では、最初に検出される完全なトークンはです&=。(現時点では、パーサーはまだ大きな構成をチェックしていないため、そのトークンがそこにあることがわかっているだけです。)

2番目の例では、検出されたトークンはです&&&&=トークンではないので!

于 2012-11-29T21:01:20.927 に答える