代码之家  ›  专栏  ›  技术社区  ›  Alexander Oh

为什么我在构造函数调用中需要双括号,比如:foo x((bar());[副本]

  •  4
  • Alexander Oh  · 技术社区  · 14 年前

    可能重复:
    Why is it an error to use an empty set of brackets to call a constructor with no arguments?

    我看过 C++ FQA entries 关于嵌套构造函数调用和支撑,他一直想知道C++解析器是如何解决这两个问题的,以及为什么解析器不可能解决它。

    所以我明白为什么 foo xxx(); 是模棱两可的。但那是什么 foo x(bar()); 模棱两可,因为这显然不是前瞻性声明。(即:应该有一个语法可以成功地检测到这一点)。

    有人能解释一下C++语法中这部分的局限性和歧义吗?

    2 回复  |  直到 9 年前
        1
  •  7
  •   David Schwartz    14 年前
    foo x(bar());
    

    这可能是:

    1) 名为的变量的声明 x 其值是默认构造的 bar 。这与 foo x = bar(); 。

    2) 名为的函数的声明 x 返回 foo 并接受一个参数——一个返回 酒吧 并且不采用任何参数。这与 foo x(bar (void));

        2
  •  4
  •   Puppy    14 年前

    C++FQA是一堆垃圾。忽略它。

    至于 foo x(bar()) ,它和 foo x() ,类型除外 x 还接受一个参数,它是一个函数。在这里加一个指针,你就会明白我的意思了。

    foo (*x)();
    foo (*x)(bar(*)());
    

    即使允许这样做的想法也太愚蠢了,但现在没有人能改变它。

    (我偷偷怀疑这语法有点错误,但我相信有人会纠正我的)。

    推荐文章