我认为在代码中显示它更容易:
#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;
或其他什么?
提前致谢
答案 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,但您不能在编译器之间做出这样的假设。