问题与C ++文档和标准文档有关。以下代码中的变量x
是否已使用?
extern int x;
template<class T> T f() { return x; }
在我看来,它没有被使用,在文件中注明的位置吗? (有这样的说法,表达式中的出现x
是odr-use,但是...)
答案 0 :(得分:1)
已被使用。 [basic.def.odr] / 2:
除非是未评估的操作数或其子表达式,否则将对其进行可能的评估。
因此,表达式x
可能被评估 。
[basic.def.odr] / 4:
变量
x
的名称显示为可能评估的表达式ex
,ex
被 odr-used 使用,除非应用左值到右值转换([conv.lval])到x
会产生一个常数表达式([expr.const])[...]
我们可以在这里停下来。将左值到右值转换应用于x
不会产生常量表达式。
这种违反ODR的行为不需要诊断([basic.def.odr] / 10):
每个程序应仅包含每个非内联的一个定义 该程序以外的函数或变量 废弃的陈述;无需诊断。
即使出于争论的目的假设f
除非/除非生成专门化,否则都不能使用x
,它仍然对程序无济于事,因为该程序也很糟糕-如果“无法为模板生成有效的专业化”([temp.res] / 8),并且由于f
的每个有效的专业化无疑会使用x
,那么就不能形成有效的专业化NDR如果程序中不存在x
的定义,则生成该文件。