模板和ODR

时间:2018-11-20 07:51:27

标签: c++ templates language-lawyer

问题与C ++文档和标准文档有关。以下代码中的变量x是否已使用?

extern int x;
template<class T> T f() { return x; }

在我看来,它没有被使用,在文件中注明的位置吗? (有这样的说法,表达式中的出现x是odr-use,但是...)

1 个答案:

答案 0 :(得分:1)

已被使用。 [basic.def.odr] / 2:

  

除非是未评估的操作数或其子表达式,否则将对其进行可能的评估

因此,表达式x可能被评估

[basic.def.odr] / 4:

  

变量x的名称显示为可能评估的表达式exex odr-used 使用,除非应用左值到右值转换([conv.lval])到x会产生一个常数表达式([expr.const])[...]

我们可以在这里停下来。将左值到右值转换应用于x不会产生常量表达式。

这种违反ODR的行为不需要诊断([basic.def.odr] / 10):

  

每个程序应仅包含每个非内联的一个定义   该程序以外的函数或变量   废弃的陈述;无需诊断。


即使出于争论的目的假设f除非/除非生成专门化,否则都不能使用x,它仍然对程序无济于事,因为该程序也很糟糕-如果“无法为模板生成有效的专业化”([temp.res] / 8),并且由于f的每个有效的专业化无疑会使用x,那么就不能形成有效的专业化NDR如果程序中不存在x的定义,则生成该文件。