c++ - 为什么 new 表达式可以正确生成指针类型,即使它应该返回 void*?

标签 c++ language-lawyer void-pointers new-expression

这个问题在这里已经有了答案:





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* .

关于c++ - 为什么 new 表达式可以正确生成指针类型,即使它应该返回 void*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59513442/

相关文章:

c++ - 快速选择 DOM 中的元素

C++ Getline & 搜索

uint8_t 可以是非字符类型吗?

c - 在嵌入式系统的简单内核中使用 void 指针表示函数和结构的语法

c++ - 钻石子问题: non-multiple inheritance in side branch still require class constructor

c++ - std::invoke 不喜欢可变参数模板成员函数?

c++ - 正在将未初始化的变量传递给另一个函数 UB

c++ - 通过placement-new手动构造一个平凡的基类

c - 是否值得更改 C 声明以增加类型安全性?

c - 将包含另一个结构的结构传递给 pthread_create