9

オブジェクトへのオプションの参照を取り、それが提供されていない場合は、関数の実行中に作成する関数を作成したい、つまり

void Foo(Bar& b = Bar()) { /* stuff */ }

もちろん、これは無効なコードです。このコンテキストでは、 を参照にBar暗黙的に変換することはできません。関数内で変更されているため、Bar参照を にすることはできません。constb

これは、右辺値参照を使用することで回避できます。つまり、

void Foo(Bar&& b = Bar()) { /* stuff */ }

これは右辺値参照の有効な使用法ですか? 通常、右辺値を渡す場合のように、渡された をクリアするつもりはありませんが、呼び出し元は引数を呼び出すstd::move必要があります。BarBar

4

2 に答える 2

8

したがって、呼び出し元に情報を返すために変更する in-out パラメーターを取る関数があります。

ただし、パラメーターをオプションにする必要があります。

したがって、解決策は、呼び出し元に引数を移動するように要求することにより、パラメーターが in パラメーターのように見えるようにすることです (これは通常、呼び出し元の状態が失われたか、未指定の状態にある可能性があることを意味します)。それは悪い、悪い設計です。関数の内部実装の便宜のために作成された奇妙な API で呼び出し元を混乱させるでしょう。実装者ではなく、ユーザー向けに API を設計する必要があります。

Deduplicator が提案することを実行して、それを 2 つの関数に分割することができます。1 つは、in-out パラメーターとして提供され、その後破棄されるダミー オブジェクトを提供します。

void Foo(Bar& b) { /* stuff */ }
void Foo() { Bar dummy{}; Foo(dummy); }

または、あなたが望んでいるように見えるのはnullになる可能性のある参照であるため、参照の使用をやめ、代わりにnullになる可能性のある何かを参照で渡すための適切な言語機能を使用します。

void Foo(Bar* b) { /* stuff, updating b if not null */ }
于 2014-08-11T22:36:11.043 に答える