【问题标题】: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++ 编译器也很有用

标签: c++ hash


【解决方案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());
猜你喜欢
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多