在构造函数中使用空std :: vector的意外编译器行为

时间:2015-10-16 15:32:44

标签: c++ g++

我有一个关于编译器/语言行为的问题,我预计会有不同的行为。 为什么下面的代码会编译?

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

它不会使用std::vector<int>(0)或其他值进行编译。但是,如果你给std::vector<int>(*)指针,它会编译。它也适用于&#34; int&#34;以外的其他类型。我希望代码根本不起作用。有人可以向我解释发生了什么吗?

以下是在cpp.sh上剪切的代码,供参考:http://cpp.sh/4l3a

我使用gcc版本4.8.4。

1 个答案:

答案 0 :(得分:2)

我假设您期望编译失败,因为A a(std::vector<int>()); 没有构造函数采用向量。

A

但这不是a的声明。它是一个名为std::vector<int>的函数的声明,它将一个指针(没有名称)带到一个返回A的函数,并返回A a(std::vector<int>(0));

当您将其更改为:

A

使用整数文字会强制解析器将其识别为对象实例化,这当然会失败,因为A a((std::vector<int>())); 没有构造函数采用向量。

您可以使用一组额外的括号在第一种情况下强制解析器的识别:

from

这是most vexing parse

的一个实例