为什么operator new不被强制将参数作为"const size_t"?

iam*_*ind 2 c++ new-operator language-lawyer

在任何地方都没有使用下面的东西,但这个问题在我脑海里仍然存在很长

void* operator new (size_t size)
{
  // distort `size` to other value
  return malloc(size);
}
Run Code Online (Sandbox Code Playgroud)

知道上面的内容可能不是一个定义明确的过载行为new(比如说size减少了),为什么标准强制编译器没有这样做void* operator new (const size_t);呢?

同样可以争论operator delete,它应该在哪里void operator delete (void* const);(添加const以避免指针变化).

Arm*_*yan 8

void* operator new (const size_t n);
void* operator new (size_t n);
Run Code Online (Sandbox Code Playgroud)

这两个是完全相同的声明operator new.唯一的区别是,如果它是一个定义,那么将允许或不允许在函数体内修改n(这与调用者无关,因为参数是通过值传递的).由于这是一个实现细节,标准不讨论它.

请记住,函数声明中会忽略顶级const.它们仅与定义相关.


Dav*_*eas 6

在两种情况下,参数的类型const std::size_t和普通std::size_tstd::size_t.标准规定在处理声明中的函数签名(稍后定义)时,const将从类型中删除.具体段落见§8.3.5/ 3:

[...]在生成参数类型列表后,会对这些类型进行多次转换以确定函数类型.将删除修改参数类型的任何cv限定符.[示例:类型void()(const int)变为void()(int) - end example]

现在,在函数的定义中,const确实具有你建议的效果:阻止你修改参数.您可以自由地operator new使用const std::size_t参数实现.另一方面,强制执行基本上没用.正如其他人所提到的那样,参数为const的事实可以通过将其复制到另一个变量并使用该变量来破坏.在没有为语言增加实际价值的情况下,向编译器添加额外的验证负担是没有意义的.