7

我们知道,它void*不包含有关它所指向的数据的实际类型的信息。但是,从 cppreference 开始newnew[]我们知道这些运算符返回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!被打印而被调用。

4

1 回答 1

8

很容易混淆new关键字和操作符new,但它们是两个不同的东西。当您编写一个内存分配函数时,它的名称是operator new,正如您所说,它确实是 return void*。但是您通常不会直接调用该操作员;相反,您使用new关键字创建一个新对象。编译器理解该关键字;它调用operator new为正在创建的对象(或对象,用于数组new)获取内存,并执行任何适当的初始化。该表达式的结果类型是指向正在创建的类型的指针。

所以,在代码中

auto x = new int{};

表达式的类型new int{}int*,所以推导的类型x也是int*

于 2019-12-28T18:02:19.057 回答