使用new[]关键字时不允许使用不完整类型

7

这段代码出现了错误

不允许不完整类型

初始化值过多

string *ReturnTwoStringsInArray()
{
   return new string[]{"return1", "return2"};
}

这个可以工作:

string *ReturnTwoStringsInArray()
{
   return new string[2]{"return1", "return2"};
}

这一个也是如此:

string arr[]{"return1","return"};

如果编译器可以从初始化列表中确定所需的大小,那么我们是否应该能够在[]中不带参数调用new呢?

2
@Swift-FridayPie 第一个是具有未知边界的new表达式,边界应该被推导出来,就像这个例子:double* p = new double[]{1,2,3}; 来自cppreference。看起来像是编译器的错误。它似乎在clang中工作正常,但在gcc或msvc中不行:https://godbolt.org/z/CQG-vq - Ted Lyngmo
你能否返回 std::array<std::string,2> - drescherjm
@TedLyngmo 这就是事后更改的结果...生产环境不太容忍规则的反悔。说实话,我不知道有哪些广泛使用的编译器会自行修补以适应已发布和嵌入稳定版本中的更改。这会破坏生命周期。clang是个例外,因为它需要适应其平台的要求。 - Swift - Friday Pie
@Swift-FridayPie 如果我正确地阅读了表格,大多数广泛使用的编译器已经进行了更改以修复早期C++版本中的缺陷报告。如果这样的更改不会冒着破坏现有代码的风险(例如P1009R2),那么我认为没有害处。如果升级到编译器的新版本,则可以访问新功能。我想在升级生产系统的编译器之前阅读发布说明非常关键。 :-) - Ted Lyngmo
@Swift-FridayPie,我不知道有任何修复缺陷报告的方法可以对早期的C++版本产生这种影响。你所描述的情况可以适用于任何想要考虑的工具链升级。必须小心进行操作,即使升级编译器通常相当容易,但它只是软件,可能会出现新的错误代替旧的已修复错误。 - Ted Lyngmo
显示剩余3条评论
1个回答

9
C++编译器支持中,我们可以看到缺陷报告P1009R2:新表达式中的数组大小推断尚未被所有编译器供应商采纳。 P1009R2表示:“措辞变更的影响应适用于所有先前版本的C++实现,其中它们适用。clang++支持C++11模式及更高版本的版本9起。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接