考虑这个非常简单的代码:
#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 ) );
被解释为函数定义?
我检查了类型名称后面的括号与 new 有区别吗?并且C++:警告:C4930:未调用原型函数(是有意的变量定义吗?),但我觉得我的问题在这里有所不同,因为我没有使用语法Foo()
nor Bar()
.
编辑:请注意,它已成功编译:
Foo* foo = new Foo;
std::shared_ptr<Foo> fooPtr( foo );
Bar bar( fooPtr );
这个问题是关于C++ 最令人烦恼的解析。该声明:
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
,因为上面的语句由于大括号而不能被解释为声明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)