C++ - 你能假设类型* = std::array:<type>:iterator吗?
C++ - Can you assume type* = std::array<type>::iterator?
我认为在代码中更容易显示:
#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上工作,但是您不能在不同的编译器上做出这样的假设。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 将系数存储在头文件的数组中("does not name a type"错误)
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- OpenCV CV_16F type
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- 将内存分配返回值强制转换为 TYPE 数组
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- reference_wrapper导致"incomplete type is not allowed"