C ++ - 你能假设类型* = std :: array <type> :: iterator?

时间:2016-11-15 12:32:58

标签: c++

我认为在代码中显示它更容易:

#include <iostream>
#include <array>

struct Test
{};

int main()
{
    std::array<Test, 1> arr {};
    Test* t = arr.begin();
}

arr.begin()返回一个迭代器但是你可以看到我可以用Test *来引用它。这似乎是可能的,因为隐式演员,我可以期望这在其他编译器中也可以根据标准工作吗?

也是运算符TYPE执行隐式转换,例如:

operator T*()
{
    return &(*this->CONTAINER)[index];
}

template <typename U>
operator U() = delete;

或其他什么?

提前致谢

3 个答案:

答案 0 :(得分:2)

std::array::begin会返回iterator,而不是pointer

iterator 可以定义为指针,但不一定是。

要获取指向第一项的指针,您可以使用std::array::data

重新进行“隐性演员”,不,这里没有。

将迭代器转换为原始指针的一般技术是首先对其进行反演,*it通常会产生一个引用,然后取一个地址&*it。但是,当没有可寻址的项目来获取地址时,这必然会失败,例如在打包的std::vector<bool>中(由实现决定它是否已打包,但如果打包) 。在这种情况下,取消引用迭代器会产生一些代理对象而不是原始引用。

答案 1 :(得分:1)

The C++ standard draft所示,iterator实现定义的

  

using iterator = implementation-defined; // see [container.requirements]

[container.requirements] 表示iterator应该be at least

  

满足前向迭代器要求的任何迭代器类别。   可转换为X :: const_iterator。

既不requirements of a forward iterator也不InputIterator的要求(ForwardIterator需要满足InputIterator的要求),Iterator的要求(InputIterator需要满足Iterator的要求)表明它们是应该有这个转换运算符,因此这是非常符合编译器的而不是标准的。

答案 2 :(得分:0)

它是实现定义:C ++ 14标准§23.3.2.1数字3.您的代码适用于GCC,但您不能在编译器之间做出这样的假设。