如何理解这段代码片段中的两对括号?
Posted
技术标签:
【中文标题】如何理解这段代码片段中的两对括号?【英文标题】:How to understand two pairs of parentheses in this code fragment? 【发布时间】:2017-02-22 18:07:29 【问题描述】:此代码来自 C++ 入门 p.446:
return hash<string>() (sd.isbn());
我不明白带有两对括号的返回表达式。本书前面没有类似的语法。
【问题讨论】:
没有上下文很难说 取决于hash<string>()
返回的内容。如果它返回一个带有重写的调用运算符的类,那没什么特别的。
在 C++11 及更高版本中,您可以使用std::hash<std::string>
(即大括号而不是圆括号)来构建对象。它使区分对象构造和函数调用更容易。
Cpp 充满了那些难以理解的花絮,这很有趣。我非常尊重那些主要从事这门语言工作的人——你需要大量的技能和记忆才能成为一名优秀的 C++ 开发人员!
@ThalesPereira 大量的技能和内存对于成为一个好的 C++ 编译器也很有用
【参考方案1】:
std::hash
是一个类类型。你在这里做的是用hash<string>()
构造一个临时的std::hash
,然后(sd.isbn())
调用那个临时的operator()
传递它sd.isbn()
。
应该是一样的
std::hash<std::string> temp;
return temp(sd.isbn());
有关使用具有operator()
的对象的更多信息,请参阅:C++ Functors - and their uses
【讨论】:
添加到这个好答案。temp(sd.isbn())
在这里可能看起来令人困惑,因为它是一个对象。该对象基本上用作函数对象,一个functor。
@GillBates 好电话。在答案中添加了一个链接。
我认为这是花括号初始化的另一个好论据,以澄清您正在构造一个对象,例如:return hash<string> (sd.isbn());
以上是关于如何理解这段代码片段中的两对括号?的主要内容,如果未能解决你的问题,请参考以下文章
调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段
如何将此 JavaScript 代码片段翻译成 Parenscript?