【问题标题】:Parenthesis around function call函数调用的括号
【发布时间】:2012-09-11 18:30:00
【问题描述】:

在下面的代码 sn-p 中,如果我排除第二次调用 std::istreambuf_iterator 周围的括号,我会在最后一行得到一个编译错误:

.c_str() 的左边必须有一个类/结构/联合。

std::ifstream file("file.txt");;

std::string prog(
    std::istreambuf_iterator<char>(file),
    (std::istreambuf_iterator<char>()));
prog.c_str();

这些括号实际上是做什么的?在我看来,他们应该能够被排除在外。

【问题讨论】:

  • 你的直觉很好:他们不应该被需要。但他们是。正如@LuchianGrigore 所说,这是为了避免“最令人烦恼的解析”,这在 C++ 语法中有点小问题。
  • 如果去掉括号,std::istreambuf_iterator&lt;char&gt;() 代表函数调用,还是内联对象实例化?这就是编译器看到的歧义,因此也是错误。
  • Vector constructor with two parameters is parsed as a function declaration 的可能重复项完全相同,只是使用向量而不是字符串。

标签: c++


【解决方案1】:

没有括号,这将是most vexing parse 的情况。它不会声明一个变量,而是一个返回std::string 的函数,称为prog 并将这两种类型作为参数。如果您稍后尝试调用它,您将收到链接器错误。

【讨论】:

  • @DavidRodríguez-dribeas 问题是,我不知道为什么。我从错误消息中收集到这是原因:) 如果您(或其他任何人)可以解释,我将删除此答案。
  • +1: 甚至不知道它有名字!只会发生在你身上一次:P
  • 它可以被解析为一个函数,它采用std::istreambuf_iterator&lt;char&gt; 类型的第一个参数,名称为file(即file 周围的括号是可选的,如int (a) = 5;)和第二个参数类型函数指针(衰减后)不带参数并返回std::istreambuf_iterator&lt;char&gt;,此参数未命名。也就是相当于一个声明:typedef std::istreambuf_iterator&lt;char&gt; it; std::string prog( it file, it (*)() );
  • @DavidRodríguez-dribeas 啊,真的。 (file) 让我很困惑。 :)
猜你喜欢
  • 2012-04-27
  • 2016-06-27
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多