2

構造体があり、次のように初期化する場合:

#include <memory>

struct MyHandle
{
        std::shared_ptr<int> handle_;
};

int main()
{
        MyHandle m{std::make_shared<int>(42)};
}

MyHandleの集約初期化が発生するため、MyHandle 型のオブジェクトを初期化するためにコンストラクターが使用されないという事実はありますか?

4

3 に答える 3

4

MyHandle は POD ではありません。POD には POD 以外のメンバーを含めることができないためです (また、shared_ptr は POD ではありません)。MyHandle オブジェクトを構築するときに、shared_ptr のコンストラクターが必ず呼び出されます。

于 2012-11-26T09:36:22.710 に答える
3

そのとおりです。集約の初期化は、ユーザー提供のコンストラクターを持たないクラスでのみ許可され、(標準の言葉では、C++11 8.5.1/2)、「各メンバーは、対応する初期化句からコピー初期化されます」。したがって、コンストラクターMyHandleは使用されず、クラス型の各メンバーのコピー、移動、または変換コンストラクターのみが使用されます。

各メンバーをデフォルトで初期化する暗黙のデフォルトコンストラクターは、デフォルトと値の初期化に使用されます。ただし、各メンバーは一度しか初期化できないため、集約の初期化には使用できません。

于 2012-11-26T09:53:58.093 に答える
2

どうやら std::shared_ptr は POD ではありません。std::is_podを使用して POD タイプを確認できます。

std::is_pod<std::shared_ptr<int>>::value

0 を返す必要があります

于 2012-11-26T09:41:05.467 に答える