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

C++ - Can you assume type* = std::array<type>::iterator?

本文关键字:type lt gt iterator array C++ 假设 类型 std      更新时间:2023-10-16

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

#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;

还是别的什么?

Thanks in advance

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

iterator 可以定义为指针,但不需要。

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


关于“隐式类型”,不,这里没有。


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

在c++标准草案中,iterator实现定义的:

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

[容器。iterator应该至少是:

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

无论是前向迭代器的要求,还是InputIterator的要求(ForwardIterator需要满足InputIterator的要求),还是迭代器的要求(InputIterator需要满足iterator的要求),都没有声明它们应该有这个转换操作符,因此这是非常特定于编译器的,而不是标准的

是实现定义的:c++ 14 Standard§23.3.2.1 number 3。您的代码可以在GCC上工作,但是您不能在不同的编译器上做出这样的假设。