无论迭代器类型/指针传递的是指向元素的地址

Vin*_*ent 17 c++ pointers iterator object-address

以下函数的最通用语法是什么:

template<IteratorType> void myFunction(const IteratorType& myIterator)
{
    _ptr = &myIterator[0];
}
Run Code Online (Sandbox Code Playgroud)

它需要一个迭代器myIterator(它可以是一个原始指针),目标是将指向的对象的地址分配myIterator给一个原始指针_ptr.目前我使用&myIterator[0]但我意识到只有随机访问迭代器才有operator [].

那么有一种语法适用于所有类型的标准迭代器和指针吗?

For*_*veR 28

您可以取消引用指针,然后获取对象的地址.

template<IteratorType> void myFunction(const IteratorType& myIterator)
{
    _ptr = &(*myIterator);
}
Run Code Online (Sandbox Code Playgroud)

  • 在`&*myIterator`中不需要括号. (5认同)
  • 请注意,如果存储的对象重载`operator&`(是的,你不应该重载`运算符&`但是语言允许它),这将失败 (2认同)

Big*_*oss 20

根据标准*运算符返回一个引用,所以在我看来最好的方法是&*myIterator,但由于类可能超载了&运算符,最好的方法是std::addressof(*myIterator)所有类的工作

  • +1为std :: addressof.如果没有C++ 11,可以使用boost :: addressof. (7认同)

eca*_*mur 5

所有迭代器都需要有operator *(24.2.2:2),所以你可以写

_ptr = &*myIterator;
Run Code Online (Sandbox Code Playgroud)

但是,这对输出迭代器无效,其中*r仅在赋值操作的左侧有效 (24.2.4:2)。

另请注意,*r提供&可以合理应用的值不一定是正确的;例如,专业化std::vector<bool>(23.3.7) 的reference类型不是bool &。在你的情况下,赋值_ptr = &*myIterator会捕捉到这一点,假设这_ptr是一个合适的指针类型,你会得到编译失败。