Синтаксис C++: оператор возврата с пробелом после шаблона; что это значит

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;.

person ted    schedule 29.05.2015    source источник
comment
Это становится (немного) менее запутанным, когда вы понимаете, что все это можно было бы записать так: return mp_header -> template construct < T > ( name ) ; То есть пробелы в первую очередь не имеют значения. Просто, поскольку и шаблон, и конструкция полностью состоят из букв алфавита, вам нужно место для их разделения, а для остальных его нет. Но это все еще одно выражение.   -  person Lightness Races in Orbit    schedule 29.05.2015


Ответы (1)


return mp_header->template construct<T>(name);

Ключевое слово template используется для указания того, что construct является шаблоном элемента типа *mp_header. Вы можете представить это как:

return mp_header->construct<T>(name);

который создает экземпляр функции-члена construct с типом T, вызывает ее с name в качестве аргумента, а затем возвращает результат. Однако C++ требует здесь ключевого слова template, так как mp_header имеет зависимый тип. См.: Где и почему Я должен поставить ключевые слова шаблона и имени типа?

person Brian Bi    schedule 29.05.2015