为什么用一个参数而不是两个参数调用deallocation函数?

4 c++ memory-management

我一直在努力理解以下行为:

#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;
}
Run Code Online (Sandbox Code Playgroud)

演示

在示例中,调用具有一个参数的非放置释放函数.但是5.3.6/10 N3797 C++ 14工作草案说:

如果类型完成并且如果解除分配函数查找同时发现仅具有指针参数的通常释放函数和具有指针参数和大小参数的通常释放函数,则所选择的释放函数应该是 具有两个参数的函数.

这是一个错误吗?

Mik*_*our 5

该规则是C++ 14中的新规则,您正在使用C++ 11标准进行编译.指定-std=c++14没有区别,因此可能是编译器尚未实现该特定规则.这并不特别令人惊讶,因为C++ 14还没有正式发布.