consteval函数取全局变量子对象地址是否构成odr-use?
问题:extern声明的对象是否因取其子对象地址而被ODR使用?
以下是完整程序代码:
struct Foo { int a, b; }; extern Foo f; consteval bool fn() { return &f.a < &f.b; } int main() { return fn(); }
假设这是无其他翻译单元的完整程序,f仅通过extern声明,没有定义。fn中获取了f的子对象地址,编译器无需f的定义就能计算&f.a < &f.b的结果,但我不确定C++标准对此场景的规定:&f.a < &f.b是否ODR使用了f?
cppreference中有这样的通俗表述:
通俗来说,若对象的值被读取(除非是编译时常量)、被写入,或其地址被获取,则该对象被ODR使用
我尝试解读后续的正式定义(也查阅了当前C++标准草案),但无法得出确切结论。从逻辑上看,此场景中f未被ODR使用(因为求值过程无需用到它的实际定义),但cppreference里“其地址被获取”的表述又似乎意味着f确实被ODR使用。
内容的提问来源于stack exchange,提问作者geza
相关产品推荐
相关产品推荐

