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

标签 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;
}

为什么 Visual Studio 会报告

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

并且没有bar对象创建...这条线怎么能Bar bar( std::shared_ptr<Foo>( foo ) );被解释为函数定义?

我检查了Do the parentheses after the type name make a difference with new?还有C++: warning: C4930: prototyped function not called (was a variable definition intended?) , 但我觉得我的问题在这里有所不同,因为我没有使用语法 Foo()也不Bar() .

编辑:注意它成功编译:

Foo* foo = new Foo;
std::shared_ptr<Foo> fooPtr( foo );
Bar bar( fooPtr );

最佳答案

这个问题是关于C++'s most vexing parse的.声明:

Bar bar( std::shared_ptr<Foo>( foo ) );

声明一个名为 bar 的函数返回 Bar并接受一个名为 foo 的参数类型 std::shared_ptr<Foo> .

最里面的括号没有作用。就好像您会编写以下内容:

Bar bar( std::shared_ptr<Foo> foo);

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

Bar bar(std::shared_ptr<Foo>{foo});

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

关于C++ 函数定义和变量声明不匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46716413/

相关文章:

c++ - 具有 vector 键的高效 C++ 关联容器

c++ - 在 pragma 并行指令中将数组声明为共享变量并稳定代码

c++ - 这是多么令人烦恼的解析?

c++ - 在不带参数的函数声明中指定使用 void 是否解决了最令人烦恼的解析问题?

c++ - 关于最令人烦恼的解析的一个令人困惑的细节

c++ - 有没有办法用模板替换这个预处理器宏,也许使用 Boost MPL?

c++ - g++自定义动态库链接错误undefined symbol

c++ - 构造函数不返回可用对象

c++ - 将无序映射写入共享内存不起作用

c++ - 最令人头疼的数组访问解析