更具体地讲,假设我写template<class Pointer> class Foo
,我要声明一个typedef
类里面的那个类型*p
,如果必须p
是类型Pointer
.
在C++ 03中,据我所知,唯一的方法是使用类似的东西
typename std::iterator_traits<Pointer>::reference
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是,如果Pointer
是一些自定义迭代器类型并且作者忘记扩展std::iterator
或以其他方式定义特化,它将不起作用std::iterator_traits
.
在C++ 11中,我的同事建议
decltype(*Pointer())
Run Code Online (Sandbox Code Playgroud)
但是如果Pointer
不是默认构造的话,这将不起作用,所以他将其修改为
decltype(**(Pointer*)0)
Run Code Online (Sandbox Code Playgroud)
我尝试了这个,但它确实有效,但后来我认为它看起来有点不确定因为它涉及空引用的解引用,因此可能不符合标准.
我们可以做得更好吗?
在C++中,我声明一个空指针int* p=0
,这是否意味着零是整数指针类型的一些特殊常量,或者它是否意味着p
指向地址0x0
?当然,因为它0x0
必须是C++在分配变量/数组时从不接触的特殊地址.