语句“vector <int> myvector()”有什么作用? (关于无参数构造函数的混淆)</int>

时间:2014-01-11 01:45:44

标签: c++

我希望有人可以解决我对您尝试使用无参数构造函数的语法的困惑。现在,我认为正确的语法要么没有括号:

foo myfoo;
vector<int> myvector;

或者,使用括号但是这样:

foo myfoo = foo();
vector<int> myvector = vector<int>();

但是,编译器并没有抱怨这种形式:

foo myfoo();
vector<int> myvector();
然而,当我试图引用&#34; myfoo&#34;的成员时,它会随后抱怨。或者&#34; myvector&#34;:

myvector.push_back(1);  // "Error: expression must have class type"

所以我从上面收集到,someClass someInstance()形式没有达到我的预期(即使用无参数构造函数实例化对象),但它确实做了某事。那究竟是什么呢?

1 个答案:

答案 0 :(得分:5)

这不是构造对象的有效方法。如果您尝试通过键入:

来调用no-arg构造函数
MyType mytype();

编译器将其解释为名为mytype的函数的声明,该函数返回MyType并且不带参数。由于编译器认为我们正在声明一个函数,因此将mytype视为对象的后续尝试失败。

由于其微妙之处,这被称为“最令人烦恼的解析”;你远不是第一个成为受害者的人。

至于为什么,我只能推测,但这里有一些推理:

  • 从概念上讲(意味着忽略标准并在逻辑上考虑语法结构),声明是不明确的。声明这样的函数是完全有效的,但它对于具有无参数构造函数的对象也是完全有效的。

  • 行为应该是一致的,例如,无论这种语法是作为函数声明还是构造函数调用解析,它都应该是一个而不是另一个。

  • 如果省略括号,很明显我们实际上正在创建一个对象,并且会自动调用no-arg构造函数。因此,对于无参数构造函数调用存在明确的语法。

  • 没有方便的方法来声明没有括号的函数(技术上可以用typedef来完成,但是来吧?你真的想要一种语言,其中每个no-arg函数必须有它的类型在typedef内声明?)。因此,函数声明不存在这种明确的语法。

  • 因此,将此语法视为函数声明是有意义的,因为没有其他方法来声明函数,而另一种方法是创建对象。

再次,纯粹的猜测,但对我来说是有意义的。