13

次のコードが与えられます:

class foo
{
};

class bar: public foo
{
public: 
    ~bar() { printf("~bar()\n"); }
};

class zab: public foo
{
public: 
    ~zab() { printf("~zab()\n"); }
};

struct foo_holder
{
    const foo &f;
};

int main()
{
    foo_holder holder[]= { {bar()}, {zab()} };
    printf("done!\n");
    return 0;
}

出力は次のとおりです。

~bar()
~zab()
done!

C ++ 0xには、新しい初期化子として使用したときにぶら下がっている参照を作成できることを指示する句がありますが、一時的なconst参照の集約初期化については何も述べていません(少なくとも私が見つけることはできません)。

それでは、この不特定の動作ですか?

4

2 に答える 2

1

例外のリストには記載されていないため、s(の配列)の有効期間と一致するように、一時的な有効期間を延長する必要がありますfoo_holder。しかし、これは私には見落としのように見えます。おそらく、欠陥レポートを提出することは良い考えかもしれません。


§12.2/5は、参照が一時的なものにバインドされると、一時的なものの存続期間が参照の存続期間と一致するように延長され、のconst foo& fメンバーであるため、参照の存続期間は、§3.7.5/に従ってfoo_holderの存続期間と一致すると述べています。 foo_holder1:1:

メンバーサブオブジェクト、基本クラスサブオブジェクト、および配列要素の保存期間は、それらの完全なオブジェクト(1.8)の保存期間です。

§3.8/1では、ストレージが解放または再利用されるとオブジェクトの存続期間が終了すると述べているため、これは参照を考慮して解釈するのが少し難しいかもしれません。

タイプTのオブジェクトの存続期間は、次の場合に終了します。

— Tが重要なデストラクタ(12.4)を持つクラスタイプの場合、デストラクタ呼び出しが開始されます。

—オブジェクトが占有するストレージが再利用または解放されます。

ただし、参照がストレージを使用するかどうかは指定されていません。§8.3.2/4は言う

参照にストレージが必要かどうかは指定されていません(3.7)。

おそらく、標準についての知識が豊富な人なら、これをよく知っているでしょう。

于 2011-04-20T12:35:45.123 に答える
1

comp.std.c++で回答を得ました。

http://groups.google.com/group/comp.std.c++/msg/9e779c0154d2f21b

基本的に、標準はそれを明示的に扱っていません。したがって、ローカルで宣言された参照と同じように動作する必要があります。

于 2011-05-30T19:43:07.657 に答える