Унифицированный синтаксис инициализации в C++11
Вопрос об "унифицированном синтаксисе инициализации" в C++11.
Законно ли инициализировать структуру следующим синтаксисом в C++11 (посмотрите на строки #128-137)? Или POD все еще актуален?
Проблема с компилятором 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.
Обратите внимание, что стандартные функции библиотеки могут не упоминаться на этих страницах.
Функция, которую вы ищете, обычно попадает в "(общие) списки инициализаторов".