正确的实例化对象的方法

时间:2013-12-06 18:13:40

标签: c++

在Visual Studio中,如果我写:

Foo f();
f.doSomething();
IDE无法识别

doSomething()

但是,如果我写:

Foo f = Foo();
f.doSomething();

Visual Studio可以识别此对象。参考C ++标准,第一种方法应该是完全正常的,不应该吗?

2 个答案:

答案 0 :(得分:4)

语句Foo f();是函数声明,而不是f类型的局部变量Foo的声明。要使用无参数构造函数声明本地Foo值,您必须省略()

Foo f;
f.doSomething();

答案 1 :(得分:1)

Foo f();

这是所谓Most Vexing Parse形式。如果使用默认构造函数实例化自动变量,则不需要()

Foo f;

如果您需要调用其他构造函数,请使用()

Foo f(some other data);

或更新的初始化语法(C ++ 11):

Foo f { some other data };

<强>详情

Scott Meyers在“有效STL”的第6项中谈到了这一点。 C ++的基本规则是,如果一行可以被解析为函数声明,那么它就是。这意味着以下两行都被解析为函数声明,而不是变量实例化:

Foo f(); // declares a function f that takes no parameters and returns a Foo
list<int>  data(istream_iterator<int>(dataFile), istream_iterator<int>()); // declares a function that takes 2 istream_iterators and returns a list<int>