【问题标题】:Declaring Local Object in C++ [duplicate]在 C++ 中声明本地对象 [重复]
【发布时间】:2013-08-23 01:18:06
【问题描述】:

C++ FAQ 中的一个问题讨论了在函数中声明本地对象的正确方法:http://www.parashift.com/c++-faq/fn-decl-vs-obj-instantiation.html

以常见问题解答为例:

class Bar { 
public: 
  Bar();
};

class Foo {
public:
  Foo(Bar const& b);
  void blah();
};

void yourCode()
{
  Foo x(Bar());  // error     
}

在 VS2012 中,错误为 Foo x(Bar (__cdecl *)(void))': prototyped function not called (was a variable definition intended?)

有人能解释一下为什么这个声明会出错吗?(C++ FAQ 解释太模糊了)。 FooBaryourCode() 的正文中都是可见的,Foo x(Bar()); 是我声明 Foo 类型对象的一种方式。

【问题讨论】:

  • 谷歌“最令人头疼的解析”,你会得到答案。
  • 一些帮助:most vexing parse
  • 不提供这个作为答案,因为我确信它是一个骗子,正如提到的它被称为“最令人烦恼的解析”......修复是添加一组额外的括号 Foo x((Bar())); 或提取Bar 实例作为变量 Bar bar; Foo x(bar);.
  • @C.R.你能给出这个答案吗?我很乐意接受。
  • @newprint:其他人有更详细的答案。你可以接受这些。

标签: c++


【解决方案1】:

由于这个 C++ 最麻烦的解析,你可以这样做:

Foo x((Bar()));

Foo x = Bar();

在您在问题中提供的 parashift 链接中查看了详细信息。
但请注意,如果将Foo 复制构造函数设为explicit,则第二个示例将中断。

【讨论】:

    【解决方案2】:

    您似乎遇到了const 一致性问题。 Foo 的构造函数需要 const BarBar() 不是。试试:

    const Bar b = Bar();
    Foo x = Foo(b);
    

    【讨论】:

    • @zneak, 然后它将一个未命名的Bar 作为参数。最简单的修复方法是 Foo x{Bar{}};imo,但它是 C++11。
    • 哦,废话,你是对的。
    • @zneak,棘手的 C++ 很棘手 :p 无论如何,我会留下它,因为它没有被提及。
    猜你喜欢
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2023-02-04
    • 2018-10-16
    相关资源
    最近更新 更多