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
以避免指针变化).
void* operator new (const size_t n);
void* operator new (size_t n);
Run Code Online (Sandbox Code Playgroud)
这两个是完全相同的声明operator new
.唯一的区别是,如果它是一个定义,那么将允许或不允许在函数体内修改n(这与调用者无关,因为参数是通过值传递的).由于这是一个实现细节,标准不讨论它.
请记住,函数声明中会忽略顶级const.它们仅与定义相关.
在两种情况下,参数的类型const std::size_t
和普通std::size_t
是std::size_t
.标准规定在处理声明中的函数签名(稍后定义)时,const
将从类型中删除.具体段落见§8.3.5/ 3:
[...]在生成参数类型列表后,会对这些类型进行多次转换以确定函数类型.将删除修改参数类型的任何cv限定符.[示例:类型void()(const int)变为void()(int) - end example]
现在,在函数的定义中,const
确实具有你建议的效果:阻止你修改参数.您可以自由地operator new
使用const std::size_t
参数实现.另一方面,强制执行基本上没用.正如其他人所提到的那样,参数为const的事实可以通过将其复制到另一个变量并使用该变量来破坏.在没有为语言增加实际价值的情况下,向编译器添加额外的验证负担是没有意义的.
归档时间: |
|
查看次数: |
626 次 |
最近记录: |