8

このコードを見たら、

class A{
public:
    A(int a):var(a){}
    int var;
};

int f(A obj) {
    return obj.var;
}

int main() {
    //std::cout<<f(23);    // output: 23
    std::cout<<f(23, 23);  // error: too many arguments to function 'int f(A)'
    return 0;
}

f(23, 23)コンマはコンマ演算子としてではなくセパレータとして機能するため、コンパイルされません。

コンマがコンマ演算子として機能しないのはどこですか? それとも逆?

4

5 に答える 5

11

文法的な観点から、関数呼び出しのパラメーターは、括弧内にオプションの式リストを形成します。式リストは、コンマトークンで区切られた1つ以上の代入式で構成されます。コンマは、式が必要な場合にのみコンマ演算子を示すことができます。

コンマ演算子は、式 a、および代入式から式を作成しますが、コンマ演算子を含む自体は代入式ではないため、次のようなものの構成要素である場合を除いて、式リストに表示できません。は代入式です。,

たとえば、任意の(コンマ演算子を使用した式を含む)を、代入式であるため式リストで有効な主式から括弧で囲むことができます。

例えば

postfix-expressionここで、expression-listは、それぞれが識別子である2つの代入式で構成されます。

f( a, b );

postfix-expressionここで、expression -listは、コンマ演算子を使用して括弧で囲まれた式であるプライマリ式である単一の代入式で構成されます。

f( (a, b) );
于 2010-06-27T18:35:42.773 に答える
8

演算子としてのコンマ トークンの使用は、関数の呼び出しと定義、変数宣言、列挙型宣言、およびセパレータとして機能する同様の構造での使用とは異なります。

ウィキペディア - コンマ演算子

于 2010-06-27T18:24:49.237 に答える
8

私はドラフト標準を検索しました。基本的に、文法では、-listプロダクションは、さまざまな項目を区切るためにコンマが含まれているものです。次の結果は C++03 固有のものです。C++0x では、expression-listはinitializer- listに直接委譲されます。これは、C++0x では中括弧リストが関数とコンストラクターの引数で同様に発生する可能性があるためです。

  • expression-list関数/コンストラクターの引数(関数キャストを含む)用
  • enumerator-list 列挙項目のリスト
  • init-declarator-list 1 つの宣言で宣言されたさまざまな名前

    例:

    int a, b;
    
  • parameter-declaration-list関数パラメーター宣言リスト (驚き!)
  • 初期化子リストexpression-list に似たリストですが、波括弧で囲まれた式リストを含めることができます。集約の初期化(配列または構造体の初期化)に使用されます
  • member-declarator-list init 宣言子リストに似ていますが、クラスのメンバー宣言用です。

    例:

    struct A { int a, b; };
    
  • base-specifier-listクラスの基本クラスのリスト。
  • mem-initializer-listメンバー初期化子のリスト

    例:

    struct A { A():a(0), b(0) { } int a; int b; };
    
  • template-parameter-listテンプレート パラメーター宣言のリスト。
  • template-argument-listテンプレートに渡されるテンプレート引数のリスト。
  • type-id-list例外仕様の型リスト

    例:

    void f() throw(int, bool) { }
    

マクロ パラメーターの識別子リストもありますが、これは実際にはプリプロセッサの文法の一部であるため、そのリストには含まれていません。

于 2010-06-27T21:51:39.690 に答える
7

これは、非常に複雑な式の言語定義と関係があります。

f(1, 2)は、2つのパラメーターを持つ関数呼び出し式です。逆に、f((1, 2))は1つのパラメーターを持つ関数呼び出し式です。これは、1, 22と評価される部分式です。

于 2010-06-27T18:30:40.000 に答える
1

コンマ演算子は常にコンマ演算子として機能しますが、コンマは必ずしもコンマ演算子を意味するとは限りません。場合によっては単なる句読点です。

いつ句読点かというと、単純な答えは「標準がそう言っているとき」です。標準がそう言っているすべての状況を経験すると、はるかに長い答えが得られますが、(一例として) ほとんどの人があまり気にしない多くのコーナーケースに対処する必要があるため、はるかに役立つ可能性は低いです。約。

于 2010-06-27T18:29:47.753 に答える