MSVC12中不允许使用默认参数中的模板类实例化?

时间:2013-11-14 08:36:44

标签: c++ templates visual-c++ compiler-errors default-parameters

我刚在项目中提取了以下问题。下面的代码只用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的默认参数中的c'tor调用bar ,它将vector的实例作为参数。这会导致在此表达式之后声明的每个类/结构出错:

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编译。我只是不明白为什么上层版本不应该编译?有什么想法?

1 个答案:

答案 0 :(得分:0)

看起来这是“最令人烦恼的解析”的问题(有关详细信息,请参阅Wikipedia上的文章)。消除新表达式歧义的一种方法是在构造函数周围添加括号,如此

foo(bar* a = new bar((vec_t()))) {};

在标准合规方面,我不确定。我浏览了N3690的第6.8节(模糊度解析)和5.3.4(新节),并且没有考虑它太难以在任何方面都没有突出。也许真正的语言律师需要介入才能给出答案。