我们知道,它void*
不包含有关它所指向的数据的实际类型的信息。但是,从 cppreference 开始new
,new[]
我们知道这些运算符返回void*
. 那么,鉴于:
auto x = new int{};
知道new
操作符应该返回void*
,是不是x
就推导出一个类型?int*
void*
再考虑一个例子:
struct foo {
static void* operator new(std::size_t n) {
std::cout << "new called!\n";
return ::new char[n];
}
};
让我们添加一些Type D isplayer :
template <typename T>
struct TD;
和测试代码:
int main() {
auto x = new foo{};
TD<decltype(x)>{};
}
代码编译失败,错误提示decltype(x)
是foo*
. 如果我们注释掉 的最后一行main
,我们就会知道,我们的void*
-returning 运算符会因为new called!
被打印而被调用。