考虑这个非常简单的代码:
#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/