【发布时间】:2016-02-02 12:49:24
【问题描述】:
使用boost::variant的指向AST节点的指针,它可以包含特殊类型的值std::nullptr_t,表示为空,我遇到了问题:[] (auto /* const */ * p) { /* use p */; }形式的通用访问者或以下形式:
struct V
{
template< typename T >
void operator () (T /* const */ * p)
{ /* use p */; }
};
无法处理std::nullptr_t 类型的值。
有很多可以想象的解决方法,但问题出现了:有没有很好的解释为什么没有(很可能受到高度限制)decltype(*nullptr) 在语言中输入(*nullptr 格式不正确,std::remove_pointer_t< std::nullptr_t > std::nullptr_t 在 libc++ 中)?这有理论上的原因吗?
【问题讨论】:
-
"std::nullptr_t 是空指针字面量 nullptr 的类型。它是一种独特的类型,它本身不是指针类型或指向成员类型的指针。"所以
std::remove_pointer_t是多余的。 -
另外,我认为使
nullptr_t成为一种类型的目的是为了可以为它编写重载和特化,因为很多人使用空值作为标志。 -
有abominable function types,但语言中没有此类类型的实例。在这方面,我认为取消引用的 nullptr 的类型与它们相似。
-
@AndyG 在通用代码中我经常只想分离指针并进一步转发它们。
-
std::is_pointer 和std::is_null_pointer 说
std::is_pointer< std::nullptr_t >::value应该是false。你确定你的静态断言吗?
标签: c++ pointers c++11 metaprogramming generic-programming