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律师您能指出标准中的措辞或提供更多详细信息吗?