【发布时间】:2012-12-20 19:32:04
【问题描述】:
在 C++11 标准中,我不明白为什么不允许使用 nullptr 的地址,而 允许使用自己的 std::nullptr_t 实例的地址.除了nullptr 是保留关键字这一事实之外,是否有任何指定的理由来做出此决定?
仅仅因为它让我感到有趣,我试图用以下函数绕过这个限制:
decltype(nullptr)* func(const decltype(nullptr) &nref) noexcept
{
return const_cast<decltype(nullptr)*>(reinterpret_cast<const decltype(nullptr)*>(&nref));
}
我不得不在参数上使用reinterpret_cast,因为没有它我会得到歇斯底里的错误:
error: invalid conversion from 'std::nullptr_t*' to 'std::nullptr_t*' [-fpermissive]
当我通过直接传递 nullptr 调用此函数时,我每次都会得到一个不同的地址。 nullptr 是否为比较等动态分配了一个地址?或者(可能更有可能)编译器是否强制创建底层对象的临时副本?
当然,这些都不是重要信息,我只是觉得有趣的是为什么要实施这个特定的限制(以及后来为什么我会看到我的行为)。
【问题讨论】:
-
nullptr是prvalue。你不能拿那些地址。不过,为错误消息 +1。