2015-10-16 25 views
-1

我有一个关于编译器/语言行为的问题,我期望其行为有所不同。 为什么下面的代码会被编译?构造函数中具有空std :: vector的意外编译器行为

#include <vector> 
class A { }; 
int main() { 
    A a(std::vector<int>()); 
} 

它不能用std::vector<int>(0)或其他值编译。不过,如果您给std::vector<int>(*)一个指针,它会进行编译。它也适用于除“int”之外的其他类型。我希望代码根本不起作用。有人可以向我解释发生了什么?

这里是剪断上cpp.sh参考代码:http://cpp.sh/4l3a

我用gcc版本4.8.4。

+0

因为它_does_编译,你应该假设它应该,而且我们不能猜测你为什么认为它不应该。 _你有什么期望?_ –

+0

抱歉,重复的答案。 @LightnessRacesinOrbit在他的回答中正确地承担了我的期望。 – Squolly

回答

2

我认为你期望它编译失败,因为A没有构造函数接受向量。但是,这并不是A的声明。它是一个称为a的函数的声明,将一个指针(无名字)带给返回std::vector<int>的函数,并返回A

当你把它改成这样:

A a(std::vector<int>(0)); 

使用一个整数文字的力量解析器认识到这一点作为一个对象实例化,而不是,这当然失败的原因A没有构造服用载体。

您可以强制解析器的认可,你的第一个情况下,也使用额外的括号:

A a((std::vector<int>())); 

这是most vexing parse的一个实例。

+0

你说得对。我认为它不应该工作,因为在std :: vector中没有定义在A中的构造函数。非常感谢您的回答。这对我帮助很大!我学到了一些关于这门语言的新东西。通过搜索找不到任何内容我不知道要搜索什么。 – Squolly

+0

@Angew:谢谢你澄清这一点 – Squolly

相关问题