C++11 の「統一された初期化構文」についての質問です。
C++11 の次の構文で構造体を初期化することは合法ですか (行番号 128 ~ 137 を参照)。それともPODはまだ実在するのですか?
MSVC 2013 コンパイラの問題。この例は正常にコンパイルされますが、不適切な関数呼び出しの例外でクラッシュします。std::function オブジェクトが正しく初期化されていないことがわかりました。
ちなみに、ICC 13.0 は例のコードをコンパイルできません。
example.cpp(130): エラー #2084: 指定子は非 POD (Plain Old Data) サブオブジェクトを指定できない可能性があります
コンパイラの欠陥ですか?または、コンパイラではすべて問題ありませんが、そのようなアプローチは C++11 に準拠していませんか?
ここに短い例があります:
#include <functional>
#include <memory>
struct dispatcher_t {};
struct binder_t {};
struct factories_t
{
std::function< std::unique_ptr< dispatcher_t > () > m_disp_factory;
std::function< std::unique_ptr< binder_t > () > m_bind_factory;
};
std::unique_ptr< dispatcher_t >
create_dispatcher()
{
return std::unique_ptr< dispatcher_t >( new dispatcher_t() );
}
std::unique_ptr< binder_t >
create_binder()
{
return std::unique_ptr< binder_t >( new binder_t() );
}
void main()
{
factories_t f{
[]() { return create_dispatcher(); },
[]() { return create_binder(); }
};
}