删除 MSVC 上具有大小的运算符?

Amb*_*ist 5 c++ windows visual-c++

我想了解为什么这里的代码仅适用于我迄今为止测试过的 MSVC?

int main() 
{
    int* ptr = new int[14];
    delete[47.55F] ptr;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我尝试寻找删除运算符的运算符重载,但我找不到任何东西

use*_*522 5

delete[47.55F]根据任何版本的 ISO C++ 标准,都不是有效语法。delete[后面只能紧跟标记]或 lambda 的非空捕获列表,该列表是delete(not delete[]) 表达式的操作数的一部分。

然而,MSVC 似乎支持语法delete[E] XwhereE是任何表达式,并有效地将其重写为类似 的内容((void)E, delete[] X),这意味着对E进行求值但其结果被丢弃,而对实际delete[]表达式进行求值,就好像非标准表达式E不存在一样。但是,我找不到任何文档说明是否E保证在 之前进行排序delete[] X

这是一个非标准语言扩展,正如 @BoP 在问题下的评论中指出的那样,它可能连接到删除表达式的预标准语法。

正如 @JanSchultke 在本答案下的评论中指出的那样,MSVC 会在警告级别 4 上发出警告。

MSVC 还接受带有 的非标准语法/permissive-,即处于标准一致性模式。

文档解释说,此扩展可以通过 激活/Ze,也可以通过 停用/Za,这似乎不包含在 中/permissive-。当使用标志时,/ZeMSVC 还会警告该标志/扩展已被弃用,并将在更高版本中删除。

  • MSVC 发出“警告 C4208:使用非标准扩展:删除 [exp] - exp 已评估但被忽略”。使用“/W4”来启用它。这不是解析器错误。 (6认同)