C++ 从分配器返回的内存上的指针算法
我知道这个问题在过去已经被问过了,也得到了一些回答。C++ 从分配器返回的内存上的指针算法,c++,c++17,language-lawyer,c++20,pointer-arithmetic,C++,C++17,Language Lawyer,C++20,Pointer Arithmetic,我知道这个问题在过去已经被问过了,也得到了一些回答。 然而,我对一个尚未澄清的细节有疑问(或者至少我找不到QA) 考虑以下代码: T *mem = allocator_traits::allocate(allocator, 10); allocator_traits::construct(allocator, mem+1, params...); 我正在mem[1]构建一个对象,即使mem[0]上的对象还不存在。 据我所知,指针算法在创建的非构造对象数组上定义得很好。但是,QA没有回答这个具体
然而,我对一个尚未澄清的细节有疑问(或者至少我找不到QA) 考虑以下代码:
T *mem = allocator_traits::allocate(allocator, 10);
allocator_traits::construct(allocator, mem+1, params...);
我正在mem[1]
构建一个对象,即使mem[0]
上的对象还不存在。
据我所知,指针算法在创建的非构造对象数组上定义得很好。但是,QA没有回答这个具体案例:
我应该说明,当我说storage+I将在P0593下得到良好定义时,我假设元素storage[0]、storage[1]、…、storage[I-1]已经构建。虽然我不确定我是否对P0593理解得足够透彻,从而得出结论,即它不会涵盖那些元素尚未构建的情况
换句话说,作者说这可能是UB。另一方面,它将使std::vector
实现无法执行以下操作:
buf_end_size = newbuf + sizeof(T) * size();
因为我希望它是有效的代码(我在一些实现中也看到了这一点),这意味着指针算法对于I
的任何值都有很好的定义,而且在没有构造对象的情况下也是如此
因此,我的问题是:在任何情况下,这是UB还是我可以安全地对
allocate
返回的指针执行指针算术,例如,如果我想在位置0之前的位置1构造元素?另外,答案在C++17和C++20之间是否有变化?std::vector
(std::
)可能使用对普通用户来说是非法的东西。@Jarod42好的,忽略关于vector的注释。:)C++20介绍newbuf+sizeof(T)*size()
似乎是可能的,但是mem+1
的合法性可能取决于T
。指针算法不仅在数组元素超出生存期时有效,甚至在整个数组处于生存期时也有效。@language律师您能指出标准中的措辞或提供更多详细信息吗?