在Visual Studio中,如果我写:
Foo f();
f.doSomething();
IDE无法识别 doSomething()
。
但是,如果我写:
Foo f = Foo();
f.doSomething();
Visual Studio可以识别此对象。参考C ++标准,第一种方法应该是完全正常的,不应该吗?
答案 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>