1

答えを探していますが、これに関する関連情報が見つかりません。例を見てみましょう:

class MyClass
{
    //member functions and variables
};

void foo(int pivot,...)
{
    va_list arguments;  
    va_start(arguments,pivot);

    //va_arg(arguments,???)

    va_end(arguments);
}

void bar()
{
    MyClass a;
    MyClass * b = &a;
    const MyClass & c = a;
    foo(0,a,b,c);
}

引数abおよびはどのようにc渡されますか? 値によって、または参照によって、va_arg を使用してそれらを求める方法は? MyClass のコンストラクタ/デストラクタはどうですか? C++ 標準のどこでこの種の動作が指定されていますか?

4

2 に答える 2

5

var-arg 関数でユーザー定義型を使用しないでください。C++11 可変個引数テンプレートを使用します。

あなたのクラスがポッド型でない場合 - 標準では指定されていません。Vaughn Cato のコメントに感謝します

n3337 5.2.2/7

自明でないコピー コンストラクタ、自明でないムーブ コンストラクタ、または自明でないデストラクタを持ち、対応するパラメータを持たないクラス型 (第 9 節) の潜在的に評価される引数を渡すことは、実装定義のセマンティクスで条件付きでサポートされます。

それ以外の場合は、正しいことはできますが、そうすべきではありません。

于 2013-02-22T14:45:51.517 に答える
3

値による。ただし、MyClassが POD でない場合、プログラムの動作が未定義 (C++03、§5.2.2/7) であるか、MyClass重要なコピー コンストラクター、ムーブ コンストラクター、またはデストラクターがある場合、操作は条件付きでサポートされます。実装定義のセマンティクス (C++11、§5.2.2/7)。

あなたの例では、渡すことaと渡すことcはまったく同じ操作です(ただしc、非 const 参照にバインドすることはできませんが、可変引数はすべて値渡しであるため、ここでは問題ではありません)。したがって、 を呼び出すときは、 、 のコピー、ポインタ のコピー、および のコピーfooを渡します。でそれらにアクセスするには、 の型を、、および として宣言する必要があります。0abafoova_argintMyClassMyClass*MyClass

于 2013-02-22T15:11:31.560 に答える