我刚刚在我们的项目中提取了以下问题。下面的代码用 g++ 编译得很好
#include <vector>
class A {};
typedef std::vector<A*> vec_t;
class bar {
public:
bar(vec_t) {};
};
class foo
{
public:
foo(bar* a = new bar(vec_t())) {};
};
class B
{};
int main()
{
return 0;
}
但是,Visual Studio 编译器(VC12,但我也认为所有其他编译器)不理解在foo的 c'tor的默认参数中,调用bar的 c'tor,它将向量的实例作为参数. 这会导致在此表达式之后声明的每个类/结构出现错误:
error C2462: 'B' : cannot define a type in a 'new-expression'
我不想讨论 c'tor 的软件设计,但这是编译器问题还是标准 C++ 中不允许,而 g++ 对此并不严格?
首先,我认为默认参数中的模板实例化可能不允许或默认参数中嵌套 c'tors。但是,如果我使用向量的另一个 c'tor:
foo(bar* a = new bar(vec_t(0))) {}
它用 MSVC 编译。我只是不明白为什么上版本不应该编译?对此有什么想法吗?