我只是在我们的项目中提取了以下问题。以下代码使用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会以 vector 的实例作为参数。这将导致在此表达式之后声明的每个类/结构均出错:
error C2462: 'B' : cannot define a type in a 'new-expression'
我不想讨论c'tor的软件设计,但这是编译器问题,还是在标准C++中是不允许的,而g++对此并不严格?
首先,我认为可能不允许默认参数中的模板实例化或将默认参数嵌套在模板中。但是,如果我使用 vector 的另一个c'tor:
foo(bar* a = new bar(vec_t(0))) {}
它与MSVC一起编译。我只是看不到为什么不应该编译较高版本?有什么想法吗?
最佳答案
看来这是“最令人烦恼的解析”的问题(有关更多信息,请参见有关Wikipedia的文章)。消除新表达式歧义的一种方法是像这样在构造函数周围添加括号
foo(bar* a = new bar((vec_t()))) {};
关于标准合规性,我不确定。我略过了N3690的第6.8节(歧义度解析)和5.3.4节(新),并且没有想过太多,没有任何办法脱颖而出。也许一位真正的语言律师将需要介入以给出答案。
关于c++ - MSVC12中不允许使用默认参数中的模板类实例化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19972966/