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,因为由于大括号,上面的语句不能被解释为声明.
| 归档时间: |
|
| 查看次数: |
323 次 |
| 最近记录: |