问题 强类型的nullptr?


我刚读了一篇关于C ++ 0x标准的文章: http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/

它说 nullptr 是强类型的,这意味着它可以与整数0区分开来。

f(int);
f(char* p);

f(nullptr); // calls char* version

这一切都很好,但我很有兴趣知道标准所说的内容 nullptr 有两个指针功能:

f(char* p);
f(int* p);

f(nullptr);

我需要演员吗?并且是 nullptr 模板?

f((int*)(nullptr);
f(static_cast<int*>(nullptr));
f(nullptr<int>);               // I would prefer this

3366
2018-06-21 19:10


起源

在你演员之后 nullptr 什么指针类型如何与铸造不同 NULL,在这两种情况下都有一个新的目标类型。 - Gene Bushuyev


答案:


我还没有看过这个的实际规格,但是我很确定你指出的调用在没有强制转换的情况下是不明确的,因为空指针可以转换为任何类型的指针。所以演员阵容应该是必要的。

不幸的是,不, nullptr 不是模板。我真的很喜欢这个想法,所以你可以考虑编写一个像这样的函数:

template <typename PtrType> PtrType null() {
     return static_cast<PtrType>(nullptr);
}

然后你就可以写了

f(null<int*>());

10
2018-06-21 19:13



你应该加入标准委员会!这是干净,漂亮的语法....另外50年,我相信它会在那里! - Dov
@Dov - 我对旧版的改进印象不深 f((int*)0);。猜猜这是委员会考虑的内容。 - Bo Persson
@Bo Persson-我认为这里的真正优势在于,虽然你仍然必须将空指针强制转换为正确的指针类型,但是你不会意外地调用在整数类型而不是指针类型上重载的函数。它还意味着您可以拥有一个明确重载的函数 nullptr_t,实际上似乎有一些用途。 - templatetypedef
@templatetypedef - 我 上午 印象深刻 nullptr 并且超载 nullptr_t。它只是实用的 null<int*>() 这不是压倒性的 - 抱歉。 :-) - Bo Persson
就个人而言,我会这样做 template<typename PtrType> PtrType* null() { return nullptr; },因为它使用量略微清洁。 - ildjarn