TL;DR:
Что означает следующий синтаксис для типа возвращаемого значения функций и оператора return? (Код из boost::interprocess
)
template <class T>
typename segment_manager::template construct_proxy<T>::type
construct(char_ptr_holder_t name)
{ return mp_header->template construct<T>(name); }
Вопрос
Пытаясь понять, что происходит в этих строках, я наткнулся на неудобный синтаксис:
//Create a new segment with given name and size
boost::interprocess::managed_shared_memory segment(boost::interprocess::create_only,
"MySharedMemory", 65536);
//Initialize shared memory STL-compatible allocator
const ShmemAllocator allocator(segment.get_segment_manager());
ShmVector* v = segment.construct<ShmVector>("ShmVector")(allocator);
В последней строке функция, которая «повторно запускает объект прокси-конструкции, бросающий объект» (документация по ускорению). По-видимому, это позволяет нам вызывать этот construct proxy
с параметрами, которые будут переданы конструктору ShmVector
(параметр шаблона). Поскольку я не смог найти документацию для construct proxy
, я решил взглянуть и нашел файл следующий код:
template <class T>
typename segment_manager::template construct_proxy<T>::type
construct(char_ptr_holder_t name)
{ return mp_header->template construct<T>(name); }
И здесь мое понимание останавливается:
- Похоже, что для конструкции функции есть два возвращаемых типа,
typename segment_manager::template
иconstruct_proxy<T>::type
, для меня это не имеет смысла. template
используется как член класса (segment_manager
,mp_header
), разве такое использование ключевых слов не запрещено?- кажется, что функции фактически возвращают два объекта/части: так предполагает синтаксис
return partA partB;
.
return mp_header -> template construct < T > ( name ) ;
То есть пробелы в первую очередь не имеют значения. Просто, поскольку и шаблон, и конструкция полностью состоят из букв алфавита, вам нужно место для их разделения, а для остальных его нет. Но это все еще одно выражение. - person Lightness Races in Orbit   schedule 29.05.2015