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

时间:2016-07-15 17:35:46

标签: c++ templates compilation function-pointers addressof

我得到了this question的正式回答,decltype应该触发函数编译。实际上decltype对声明但未定义的函数是合法的。

接下来的问题,应该取一个函数的地址触发一个函数的编译?拿this example

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

int main()
{
    auto bar = &foo<int>;
}

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

  

请求func中的成员x,该类型为非类型int

但是,如果我只是定义foo并且没有声明它,那么代码编译得很好。有人可以向我提供官方消息,说明是否需要使用函数的地址进行编译吗?

1 个答案:

答案 0 :(得分:2)

3.2 / 2:

  

表达式可能会被评估,除非它是未评估的   操作数(第5条)或其子表达式。 ......非超载   函数,其名称显示为可能已评估的表达式或   一组候选函数的成员,如果由重载选择   从可能评估的表达式中引用时的分辨率,   是odr-used,除非它是一个纯虚函数而它的名字不是   明确合格。

然后3.2 / 3:

  

每个程序都应包含每个非内联的一个定义   在该程序中使用的函数或变量;没有诊断   需要。定义可以在程序中明确显示,也可以   可以在标准库或用户定义的库中找到,或者(在   适当的)它被隐含地定义(见12.1,12.4和   12.8)。内联函数应在每个使用它的翻译单元中定义。

函数名称绝对不是未评估的操作数(例如sizeofdecltype),它出现在表达式中,因此可能会对其进行评估。然后第二个只需要一个非内联定义,或每个翻译单元中相同的内联定义。