Look at this snippet:
struct Foo {
int a, b;
};
extern Foo f;
consteval bool fn() {
return &f.a < &f.b;
}
int main() {
return fn();
}
Suppose that this is the whole program (no other translation units), f
has no definition available (it's only extern
declared). But fn
takes the address of a subobject of f
. Of course, the compiler can evaluate &f.a < &f.b
without the definition. But I'm not sure what the standard says about this case. Does &f.a < &f.b
odr-use f
? cppreference says that
Informally, an object is odr-used if its value is read (unless it is a compile time constant) or written, its address is taken
I tried to interpret the "Formally" part which is described afterwards (and I also checked the current draft standard about this), but I couldn't draw a confident conclusion.
It would make sense that in this case f
is not odr-used (because it's not really needed to evaluate the expression), but the "its address is taken" at cppreference may mean that f
is odr-used.