Унифицированный синтаксис инициализации в C++11

Вопрос об "унифицированном синтаксисе инициализации" в C++11.

Законно ли инициализировать структуру следующим синтаксисом в C++11 (посмотрите на строки #128-137)? Или POD все еще актуален?

http://pastebin.com/GMZ5QDmR

Проблема с компилятором MSVC 2013. Этот пример успешно компилируется, но завершается с ошибкой при неправильном вызове функции. Это говорит мне, что объект std::function не инициализирован должным образом.

Кстати, ICC 13.0 не может скомпилировать код в примере.

example.cpp (130): ошибка #2084: указатель не может указывать подобъект не POD (обычные старые данные)

Это дефект в компиляторах? Или с компиляторами все в порядке, и такой подход не совместим с 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(); }
    };
}

1 ответ

Первый: void main незаконно в C++. использование int main,

Microsoft Visual Studio 2013 не звезда класса C++ 11. Компилятор Intel также не является версией 13, поскольку у них есть версия 14. При этом вы можете попробовать ноябрьскую CTP- версию MSVC++ 2013, которая немного лучше по языковой поддержке.

Если вы хотите проверить, верен ли ваш код, используйте последнюю версию GCC или Clang, обе из которых доступны на самой большой платформе онлайн-компиляторов за всю историю.

Особенности языка C++ сообщаются на веб-сайтах поставщика:

Любой другой компилятор C++ не стоит упоминать по сравнению с C++ 11.

Обратите внимание, что стандартные функции библиотеки могут не упоминаться на этих страницах.

Функция, которую вы ищете, обычно попадает в "(общие) списки инициализаторов".

Другие вопросы по тегам