应该采用模板化函数的地址触发其编译?

Jon*_*Mee 7 c++ templates compilation function-pointers addressof

我得到了一个官方的回答这个问题,decltype应该不会触发函数编写.事实上,decltype在声明但未定义的函数上是合法的.

接下来的问题,应该取一个函数的地址触发一个函数的编译?就拿这个例子:

template <typename T>
void foo(T&& x) { x.func(); }

int main()
{
    auto bar = &foo<int>;
}
Run Code Online (Sandbox Code Playgroud)

我测试的所有编译器都失败了,例如:

请求部件funcx,其是非类类型的int

但是,如果我只是定义foo并且不声明它,那么代码编译得很好.有人可以向我提供官方消息来源,了解是否需要获取函数的地址需要编译吗?

Mar*_*k B 2

3.2/2:

表达式可能会被求值,除非它是未求值的操作数(第 5 条)或其子表达式。...名称显示为潜在评估表达式或一组候选函数的成员的非重载函数,如果在从潜在评估表达式引用时通过重载决策选择,则使用 odr,除非它是纯虚函数及其名称没有显式限定。

然后是3.2/3:

每个程序都应包含该程序中使用的每个非内联函数或变量的确切定义;无需诊断。该定义可以显式地出现在程序中,可以在标准或用户定义的库中找到,或者(在适当的情况下)它是隐式定义的(参见12.1、12.4和12.8)。内联函数应在使用 odr 的每个翻译单元中定义。

函数名称绝对不是未计算的操作数(例如 to sizeof, decltype),并且它出现在表达式中,因此可能会计算它。那么第二个需要在每个翻译单元中恰好有一个非内联定义或相同的内联定义。

  • @Jonathan Mee 标准“明确指出”,像“decltype”操作数这样的上下文不会被潜在地评估,但在任何其他上下文中,当名称出现在表达式中时,它可能会被评估。 (2认同)