考虑以下两个功能:
void foo() {}
void bar() {}
可以保证&foo != &bar吗?
同样,
template<class T> void foo() { }
可以保证&foo<int> != &foo<double>吗?
我知道折叠功能定义有两个链接器。
MSVC积极地将COMDAT折叠功能,因此可以将具有相同实现的两个功能转换为一个功能。副作用是,两个函数共享相同的地址。我当时以为这是非法的,但我找不到标准中将其规定为非法的地方。
黄金链接器还会折叠带有safe和的功能all。 safe表示如果使用功能地址,则不折叠,all即使使用地址也将折叠。因此safe,如果函数具有不同的地址,金的折痕就表现出来。
虽然折叠可能是意料之外的,并且代码依赖于具有不同地址的不同(相同实现)函数(因此折叠可能很危险),但是在当前的C ++标准下,它实际上是非法的吗?(此时为C ++ 14)(自然,如果safe折叠合法)
慕的地6264312
相关分类