我们知道,它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!被打印而被调用。