構造体があり、次のように初期化する場合:
#include <memory>
struct MyHandle
{
std::shared_ptr<int> handle_;
};
int main()
{
MyHandle m{std::make_shared<int>(42)};
}
MyHandleの集約初期化が発生するため、MyHandle 型のオブジェクトを初期化するためにコンストラクターが使用されないという事実はありますか?
構造体があり、次のように初期化する場合:
#include <memory>
struct MyHandle
{
std::shared_ptr<int> handle_;
};
int main()
{
MyHandle m{std::make_shared<int>(42)};
}
MyHandleの集約初期化が発生するため、MyHandle 型のオブジェクトを初期化するためにコンストラクターが使用されないという事実はありますか?
MyHandle は POD ではありません。POD には POD 以外のメンバーを含めることができないためです (また、shared_ptr は POD ではありません)。MyHandle オブジェクトを構築するときに、shared_ptr のコンストラクターが必ず呼び出されます。
そのとおりです。集約の初期化は、ユーザー提供のコンストラクターを持たないクラスでのみ許可され、(標準の言葉では、C++11 8.5.1/2)、「各メンバーは、対応する初期化句からコピー初期化されます」。したがって、コンストラクターMyHandle
は使用されず、クラス型の各メンバーのコピー、移動、または変換コンストラクターのみが使用されます。
各メンバーをデフォルトで初期化する暗黙のデフォルトコンストラクターは、デフォルトと値の初期化に使用されます。ただし、各メンバーは一度しか初期化できないため、集約の初期化には使用できません。
どうやら std::shared_ptr は POD ではありません。std::is_podを使用して POD タイプを確認できます。
std::is_pod<std::shared_ptr<int>>::value
0 を返す必要があります