0

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

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

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

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

Live Example

这不合法吧?但如果不是,为什么要建造?

4

2 回答 2

5

来自[basic.def.odr]

每个程序都应包含该程序中 odr 使用的每个非内联函数或变量的准确定义;无需诊断。

foo是 odr-used,但没有定义(大概 - 否则问题没有实际意义)。该程序格式错误,但由于不需要诊断,因此可以编译。

通常,是链接器捕获了定义的缺失,而不是编译器,因为定义很容易出现在不同的翻译单元中。试图将static const int缺少定义的 a 传递给对std::max()or的调用的典型示例std::min()

于 2016-07-18T13:16:16.570 回答
1

Your example is working because the address is never used, so the linker never searches for the symbol.

If you try to print bar, the linking fails.

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

http://ideone.com/97Eo6Z

于 2016-07-18T13:21:45.433 回答