C++ 17 (expr.add/4)을 말한다 :실제로 char 배열을 가리 키지 않을 때 "char *"포인터 UB에 추가 중입니까?
일체형을 갖는식이에 첨가하거나 포인터로부터 감산결과 포인터 피연산자의 형태를 갖는다. 표현식 P가 n 요소가있는 배열 객체 x의 요소 x [i]를 가리키는 경우 P + J 및 J + P (J는 값 j를 가짐) 표현식은 요소 x를 가리 킵니다. [i + j] 0≤i + j≤n 인 경우; 그렇지 않으면 동작이 정의되지 않습니다. 마찬가지로 P - J 이라는 표현식은 0≤i-j≤n 인 경우 (아마도 가상의) 요소 x [i-j]를 가리 킵니다. 그렇지 않으면 동작이 정의되지 않습니다.
struct Foo {
float x, y, z;
};
Foo f;
char *p = reinterpret_cast<char*>(&f) + offsetof(Foo, z); // (*)
*reinterpret_cast<float*>(p) = 42.0f;
(*)가 UB로 표시된 선을 했습니까?
reinterpret_cast<char*>(&f)
은 char 배열을 가리 키지 않고 float로 가리 키므로 인용 단락에 따라 UB이어야합니다. 그러나 그것이 UB라면
offsetof
의 유용성은 제한 될 것입니다.
UB입니까? 그렇지 않다면 왜 안 되겠습니까?
[\ [basic.lval \]/8] (https://timsong-cpp.github.io/cppwp/n4659/basic.lval#8) – StoryTeller
@StoryTeller : line (*)은 액세스하지 않습니다. , 그것은 단지 포인터 조작입니다. – geza
UB가 아닙니다. 변수의 주소를 가져 와서 'char *'로 캐스팅 한 다음 원래 유형으로 되돌립니다. 유효한 객체 ('z'의 주소)를 가리 킵니다. – Brandon