gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:04:47 25 4
gpt4 key购买 nike

我只是在我们的项目中提取了以下问题。以下代码使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com