1

C++11 の「統一された初期化構文」についての質問です。

C++11 の次の構文で構造体を初期化することは合法ですか (行番号 128 ~ 137 を参照)。それともPODはまだ実在するのですか?

http://pastebin.com/GMZ5QDmR

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(); }
    };
}
4

1 に答える 1

2

最初: void mainC++ では違法です。を使用しint mainます。

Microsoft Visual Studio 2013 は C++11 クラスのスターではありません。どちらも Intel のコンパイラ バージョン 13 ではありません。なぜなら、彼らにはバージョン 14 があるからです。そうは言っても、MSVC++ 2013 November CTPを試すことができます。

コードが有効かどうかを確認したい場合は、GCC または Clang の最新バージョンを使用してください。どちらもGreatest Online Compiler Platform in Existence で入手できます。

C++ 言語機能は、ベンダーの Web サイトで報告されています。

他の C++ コンパイラは、C++11 に関して言及する価値はありません。

これらのページでは、標準ライブラリの機能について言及されていない場合があることに注意してください。

あなたが探している機能は、通常、「(一般的な)初期化子リスト」に分類されます。

于 2014-07-29T14:35:16.123 に答える