gpt4 book ai didi

c++ - 通过函数模板传递时无法从 0 构造指针

转载 作者:太空狗 更新时间:2023-10-29 19:58:36 28 4
gpt4 key购买 nike

假设我有一个任意类型:struct Bar {};。我想从 0 构造一个 Bar*,我可以明确地这样做:

Bar* b = 0; 

我什至可以通过函数调用隐式地完成它:

void foo(Bar* b) { Bar* x = b; }

foo(0);

但是当我通过函数 模板 传递 0 时,这种能力就消失了:

template <typename T>
void foo(T t) {
Bar* x = t;
}

foo(0); // error: invalid conversion from ‘int’ to ‘Bar*’

为什么不呢?其他两个不再适用的公式有何特别之处?

最佳答案

将指针初始化为 0 不同于将 0(即 int 文字)类型推导为 Bar*。因此错误。

为了遵守 标准使用 nullptr 关键字而不是普通的 0 文字来消除类型歧义。
另请注意,使用旧的 NULL 宏的 c++11 之前的标准实现可能比普通的 0 文字更好,因为 NULL 通常扩展为 (void*)0,这在使用模板和指向模板参数类型的指针时也会有所不同。

对于你的(稍微错误的)模板函数定义

template <typename T>
void foo(T* t) {
// ^^ Note!
T* x = t;
// ^ Note!
}

以下代码应使用 C++11 编译为

foo(nullptr); // C++11

和 Pre C++11 一样

foo((void*)0); // NULL didn't work for IDEONE GCC 4.8 and including 
// <cstddef>. I'd expect it to expand to (void*)0, but
// it seems expanding to (int*)0 ?!?

更新:
如果要确保传递的指针类型符合某些基类指针类型,则需要显式转换:

template <typename T>
void foo(T* t) {
Bar* x = static_cast<Bar*>(t);
}

但是你必须将一个具体的指针类型传递给函数:

class Derived : public Bar
{
// Blah!
};

Derived* x = 0;

foo(derived);

static_cast 不适用于 void 指针!

关于c++ - 通过函数模板传递时无法从 0 构造指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20081020/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com