c++之为什么 new 表达式可以正确生成指针类型,即使它应该返回 void*
emanlee
阅读:33
2025-02-15 21:57:57
评论:0
这个问题在这里已经有了答案:
Difference between 'new operator' and 'operator new'?
(8 个回答)
1年前关闭。
我们知道void*
没有关于它指向的数据的实际类型的信息。但是,来自 new
and new[]
上的 cppreference我们知道这些操作符返回 void*
.那么,如何给出:
auto x = new int{};
知道
new
运算符(operator)应该返回
void*
,
x
推断为
int*
类型,不是
void*
?
再考虑一个例子:
struct foo {
static void* operator new(std::size_t n) {
std::cout << "new called!\n";
return ::new char[n];
}
};
让我们添加一些 电话 是 D 播放器:
template <typename T>
struct TD;
和测试代码:
int main() {
auto x = new foo{};
TD<decltype(x)>{};
}
代码编译失败,错误提示
decltype(x)
是
foo*
.如果我们注释掉
main
的最后一行,我们会知道我们的,
void*
-returning operator 将被调用由于
new called!
正在打印。
请您参考如下方法:
很容易混淆new
带有运算符的关键字 new
,但它们是两种不同的东西。当你写一个内存分配函数时,它的名字是operator new
正如你所说,它确实返回 void*
.但是您通常不会直接调用该运算符(operator);相反,您使用 new
创建一个新对象。关键词。 编译器理解那个关键字;它叫 operator new
为正在创建的对象(或对象,用于数组 new
)获取内存并进行任何适当的初始化。该表达式的结果类型是指向正在创建的类型的指针。
所以,在代码中
auto x = new int{};
表达式的类型
new int{}
是
int*
,所以
x
的推导类型也是
int*
.
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。