模板和ODR

gue*_*est 5 c++ templates language-lawyer

问题是关于C++文档和标准文档.在下面的代码中使用xodr 变量?

extern int x;
template<class T> T f() { return x; }
Run Code Online (Sandbox Code Playgroud)

在我看来它没有被使用,芽在文件中说明了什么?(有声明,x表达中的外观是odr-use,但......)

T.C*_*.C. 1

它是 odr 使用的。[basic.def.odr]/2:

表达式可能会被求值,除非它是未求值的操作数或其子表达式。

因此该表达式x可能被求值

[basic.def.odr]/4:

名称x显示为潜在计算表达式的变量ex被 odr 使用ex除非应用左值到右值转换 ([conv.lval]) 生成x常量表达式 ([expr.const]) [...]

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

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

每个程序都应包含在该程序中在废弃语句之外使用的每个非内联函数或变量的精确定义;无需诊断。


即使为了论证而假设在/除非生成专门化之前f不会使用 odr-use x,它仍然对程序没有帮助,因为如果“无法为模板生成有效的专门化”,则该程序也是格式错误的 NDR " ([temp.res]/8),并且由于f无疑 odr-uses的每个有效特化,如果程序中不存在 的x定义,则无法生成有效的特化。x