質問はそれをすべて本当に言います。
デフォルトのコンストラクターを実装する場合、代わりに const ポインター メンバーを使用する方がよいでしょうか?
メンバー初期化リストを使用する必要があります。
struct foo
{
const int& ref;
foo() : ref(some_value()) { }
}
some_value()
あなたに一時的なものを与えないことを確認してください。コンストラクターが終了するまで、その寿命が延長されるだけです。
コンストラクターの ctor-initializer (12.6.2) の参照メンバーへの一時的なバインドは、コンストラクターが終了するまで持続します。
それは、デフォルトのケースでメンバーに何を参照してもらいたいかによって異なります。考えられる解決策は、デフォルト オブジェクト (おそらく何らかのNull オブジェクト)を持つことです。
struct Foo
{
Foo() : bar_(defaultBar) {}
Foo(Bar &bar) : bar_(bar) {}
private:
Bar &bar_;
static Bar defaultBar;
};
または、@sftrabbit が示すように、関数からオブジェクトへの参照を取得できます。