C++函数定义和变量声明不匹配?

jpo*_*o38 4 c++ most-vexing-parse

考虑这个非常简单的代码:

#include <memory>

class Foo
{
public:
    Foo() {};
};

class Bar
{
public:
    Bar( const std::shared_ptr<Foo>& foo ) {}
}; 

int main()
{
    Foo* foo = new Foo;
    Bar bar( std::shared_ptr<Foo>( foo ) );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么Visual Studio会报告

warning C4930: 'Bar bar(std::shared_ptr<Foo>)': prototyped function not called (was a variable definition intended?)
Run Code Online (Sandbox Code Playgroud)

并且没有bar创建对象......如何将此行Bar bar( std::shared_ptr<Foo>( foo ) );解释为函数定义?

我检查了类型名称与new之后的括号吗?还有C++:警告:C4930:未调用原型函数(是一个变量定义?),但我觉得我的问题不同,因为我没有使用语法Foo()也没有Bar().

编辑:请注意,它成功编译:

Foo* foo = new Foo;
std::shared_ptr<Foo> fooPtr( foo );
Bar bar( fooPtr );
Run Code Online (Sandbox Code Playgroud)

眠りネ*_*ネロク 14

这个问题是关于C++最令人烦恼的解析.该声明:

Bar bar( std::shared_ptr<Foo>( foo ) );
Run Code Online (Sandbox Code Playgroud)

声明一个名为return的函数bar,Bar并返回一个名为footype 的参数std::shared_ptr<Foo>.

最里面的括号没有效果.就好像你会写下面的内容:

Bar bar( std::shared_ptr<Foo> foo);
Run Code Online (Sandbox Code Playgroud)

假设C++ 11(因为您已经在使用std::shared_ptr),您可以使用大括号语法而不是括号:

Bar bar(std::shared_ptr<Foo>{foo});
Run Code Online (Sandbox Code Playgroud)

这实际上构造了一个bar类型的对象Bar,因为由于大括号,上面的语句不能被解释为声明.

  • 你的意思是它相当于`Bar bar(std :: shared_ptr <Foo> foo);`? (3认同)
  • 正确,但如果您对Most Vexing Parse有解释或链接并提供解决方案,则可能是更好的答案. (2认同)