我一直试图了解以下行为:
#include <iostream>
#include <cstdlib>
using namespace std;
struct A
{
void operator delete[](void *p)
{
cout << "delete\n";
::operator delete[](p);
}
void operator delete[](void *p, size_t t)
{
cout << "delete with two arguments\n";
::operator delete[](p);
}
};
int main()
{
A *a = new A[5];
delete [] a;
}
在示例中,调用一个参数的非放置重新分配函数。但是5.3.6 / 10 N3797 C ++ 14工作草案说:
如果类型已完成且释放函数查找同时找到两者 通常的释放函数,只有一个指针参数和一个 通常的释放函数,包含指针参数和大小 参数,然后选择的释放函数应该是一个 有两个参数。
这是一个错误吗?
答案 0 :(得分:5)
该规则是C ++ 14中的新规则,您可以根据C ++ 11标准进行编译。指定-std=c++14
没有区别,所以推测编译器还没有实现该特定规则。这并不特别令人惊讶,因为C ++ 14还没有正式发布。
答案 1 :(得分:1)
所以这是一个新的C ++ 1y规则,但我们可以从defect report 1788看到该语言可能会更改为以下内容:
要调用的函数选择如下:
如果类型是完整的,并且对于第二个替代(删除数组),操作数是指向具有非平凡析构函数或其(可能是多维)数组的类类型的指针,选择具有两个参数的函数。
否则,未指定选择了哪两个释放函数。
答案 2 :(得分:0)
在N3797的3.7.4.2/2中,它说:
如果类T具有名为operator的成员释放函数 删除[]只有一个参数,那么该函数是通常的 (非放置)释放功能。如果T类没有声明 这样的运算符delete []但确实声明了成员释放 函数名为operator delete [],正好有两个参数,即 其中第二个类型为std :: size_t,那么这个函数是通常的 释放功能。
由于你有单个参数delete []函数,那就是被调用的函数。