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/46218836/

相关文章:

c++ - 将 float 转换为 int,还是将 int 转换为 float?

php - 使用cURL将数据从网页复制到cpp中的字符串

c++ - 将函数声明转换为变量定义的简单技巧

c++ - 视觉 C++ : No default constructor

c++ - 最烦人的解析

c++ - 关于封装和继承实践的问题

c++ - 将缺少的扩展名附加到 QFileDialog 的结果

c++ - 传递常量引用...它是否像最重要的常量一样工作?

c++ - 最令人烦恼的解析是否带有合格的 id?

c++ - 如何正确地将右值绑定(bind)到构造函数?