如何理解这段代码片段中的两对括号?

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&lt;string&gt;() 返回的内容。如果它返回一个带有重写的调用运算符的类,那没什么特别的。 在 C++11 及更高版本中,您可以使用std::hash&lt;std::string&gt;(即大括号而不是圆括号)来构建对象。它使区分对象构造和函数调用更容易。 Cpp 充满了那些难以理解的花絮,这很有趣。我非常尊重那些主要从事这门语言工作的人——你需要大量的技能和记忆才能成为一名优秀的 C++ 开发人员! @ThalesPereira 大量的技能和内存对于成为一个好的 C++ 编译器也很有用 【参考方案1】:

std::hash 是一个类类型。你在这里做的是用hash&lt;string&gt;() 构造一个临时的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&lt;string&gt; (sd.isbn());

以上是关于如何理解这段代码片段中的两对括号?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码会泄露? (简单的代码片段)

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

如何重构这个 Java 代码片段

如何将此 JavaScript 代码片段翻译成 Parenscript?

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

如何将一个表中的两对与 MySQL 上另一个表中的两对进行比较