为什么使用声明的函数的地址只能工作?

时间:2016-07-18 13:08:03

标签: c++ function-pointers function-declaration addressof function-definition

我已经问过question here是否取得函数的地址是否强制编译所述函数,特别是关于Substitution-Failure-Is-Not-An-Error。最直接的答案可以找到here

  

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

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

void foo(int);
auto bar = &foo;

Live Example

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

2 个答案:

答案 0 :(得分:5)

来自[basic.def.odr]

  

每个程序都应该包含每个非内联函数或变量的一个定义   那个节目;无需诊断。

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

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

答案 1 :(得分:1)

您的示例正在运行,因为从未使用过地址,因此链接器从不搜索符号。

如果您尝试打印bar,则链接失败。

void foo(int);
auto bar = &foo;
cout << (void*) bar;

http://ideone.com/97Eo6Z