我得到了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
并且没有声明它,那么代码编译得很好。有人可以向我提供官方消息,说明是否需要使用函数的地址进行编译吗?
答案 0 :(得分:2)
3.2 / 2:
表达式可能会被评估,除非它是未评估的 操作数(第5条)或其子表达式。 ......非超载 函数,其名称显示为可能已评估的表达式或 一组候选函数的成员,如果由重载选择 从可能评估的表达式中引用时的分辨率, 是odr-used,除非它是一个纯虚函数而它的名字不是 明确合格。
然后3.2 / 3:
每个程序都应包含每个非内联的一个定义 在该程序中使用的函数或变量;没有诊断 需要。定义可以在程序中明确显示,也可以 可以在标准库或用户定义的库中找到,或者(在 适当的)它被隐含地定义(见12.1,12.4和 12.8)。内联函数应在每个使用它的翻译单元中定义。
函数名称绝对不是未评估的操作数(例如sizeof
,decltype
),它出现在表达式中,因此可能会对其进行评估。然后第二个只需要一个非内联定义,或每个翻译单元中相同的内联定义。