为什么取一个被声明的函数的地址起作用?

Jon*_*Mee 0 c++ function-pointers addressof function-declaration function-definition

我在这里问了一个问题,即取一个函数的地址是否强制编译所述函数,特别是关于Substitution-Failure-Is-Not-An-Error.最直接的答案可以在这里找到:

非正式地,如果一个对象的地址被占用,或者一个引用被绑定到它上面,则该对象被使用,并且如果对它进行函数调用或者取得其地址,则该函数被使用.如果一个对象或函数使用了odr,它的定义必须存在于程序的某个地方; 违反这一点的是链接时错误.

但是我测试的所有编译器都表明这是完全可行的:

void foo(int);
auto bar = &foo;
Run Code Online (Sandbox Code Playgroud)

Live Example

这不合法吗?但如果没有,为什么要建造?

Bar*_*rry 5

来自[basic.def.odr]:

每个程序应该只包含该程序中使用的每个非内联函数或变量的一个定义; 无需诊断.

foo是有用的,但没有定义(大概 - 否则这个问题没有实际意义).该程序格式不正确,但由于不需要诊断,因此编译是有效的.

通常,链接器会捕获缺少定义 - 而不是编译器,因为定义可以很容易地出现在不同的转换单元中.试图将static const int缺少定义的一个定义传递给std::max()或调用的规范示例std::min().