我有一个关于编译器/语言行为的问题,我预计会有不同的行为。 为什么下面的代码会编译?
#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。
答案 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
的一个实例