C++ 语法:在“模板”之后带有空格的 return 语句;这是啥意思[重复]

Posted

技术标签:

【中文标题】C++ 语法:在“模板”之后带有空格的 return 语句;这是啥意思[重复]【英文标题】:C++ Syntax: return statement with space after "template"; what does it mean [duplicate]C++ 语法:在“模板”之后带有空格的 return 语句;这是什么意思[重复] 【发布时间】:2015-05-29 01:26:51 【问题描述】:

TL;DR:

以下函数返回类型和返回语句的语法是什么意思? (代码来自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);  

问题

在尝试了解 these lines 中发生的事情时,我遇到了一些不正确的语法:

//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);

在最后一行中,调用了“返回'抛出'构造代理对象”(boost documentation)的函数。显然,它允许我们使用将传递给ShmVector(模板参数)的构造函数的参数来调用这个construct proxy。由于我找不到construct proxy 的文档,我决定看一下并找到following code:

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::templateconstruct_proxy&lt;T&gt;::type,这对我来说没有意义 template 被用作类成员(segment_managermp_header),这样使用关键字不是不允许吗? 这些函数似乎实际上返回了两个对象/部分: 语法 return partA partB; 建议这样做。

【问题讨论】:

当你意识到整个事情可以写成:return mp_header -&gt; template construct &lt; T &gt; ( name ) ;时,它变得(稍微)不那么混乱了。也就是说,首先,空格在很大程度上是不相关的。只是,由于“模板”和“构造”都是完全由字母组成的,因此您需要 将它们分开,而其余部分则不需要。但它仍然是一个单一的表达式。 【参考方案1】:
return mp_header->template construct<T>(name);

关键字template用于表示construct*mp_header类型的成员模板。你可以把它想象成:

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

它用T 类型实例化construct 成员函数,用name 作为参数调用它,然后返回结果。但是,C++ 在这里需要 template 关键字,因为 mp_header 具有依赖类型。见:Where and why do I have to put the "template" and "typename" keywords?

【讨论】:

以上是关于C++ 语法:在“模板”之后带有空格的 return 语句;这是啥意思[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++中的可变参数模板

有没有办法在 c++ 中获得一个带有空格的完整字符串?

Markdown模板

在 C++ 中使用默认参数跳过模板参数真的不可能吗,为啥语法建议不这样?

[c++][语言语法]函数模板和模板函数

C++基础语法模板