1

重複の可能性:
非静的メンバー関数のデフォルト引数としての非静的メンバー
メンバー変数をパラメーターのデフォルトとして使用できないのはなぜですか?

ここで非常に単純化されたものを見ていなかったり、C++ の基本的なルールを忘れていたりする場合は、前もってお詫びしますが、なぜこれが期待どおりに機能しないのかわかりません。

動作しないコードの例を次に示します

class Foo
{
private:
    Bar *ptrBar;
public:
    void doSomething(int x, Bar *p = ptrBar);
}

コンパイラは、この関数のデフォルト パラメータに問題があります。これが機能しない理由は何かありますか。

基本的に doSomething は Bar オブジェクトに対して何らかの操作を行いますが、デフォルトで ptrBar が指すものにしたいと考えています。私が何かを忘れていない限り、すべてが健全に見えますか?

4

2 に答える 2

5

クラス メンバーをデフォルト パラメータとして使用することも、this.

8.3.6 デフォルト引数 [dcl.fct.default]

[...] 同様に、クラス メンバー アクセス式 (5.2.5) の id-expression として表示されない限り、またはそれが評価されない場合でも、非静的メンバーは既定の引数で使用されません。メンバーへのポインターを形成するために使用されます (5.3.1)。[...]

最善の回避策は、オーバーロードを使用することです。

class Foo
{
private:
    Bar *prtBar;
public:
    void doSomething(int x, Bar *p);
    void doSomething(int x)
    {
        soSomething(x, ptrBar);
    }
}
于 2012-12-16T07:32:44.473 に答える
1

コンパイラがこれを評価している時点でptrBarは、設定されていません。したがって、デフォルト パラメータにはデフォルト値がありません。

デフォルトの null を使用しないのはなぜですか。 pinが null の場合は、メンバーdoSomething()を使用してください。ptrBar

于 2012-12-16T07:33:20.463 に答える