不同的功能是否具有不同的地址?

考虑以下两个功能:


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折叠合法)


森林海
浏览 320回答 3
3回答

慕的地6264312

5.10平等经营者 [expr.eq]1 ==(等于)和!=(不等于)运算符组从左到右。操作数应具有算术,枚举,指针或指向成员类型或type的指针std::nullptr_t。运算符==和!=两者都产生true或false,即type的结果bool。在下面的每种情况下,在应用了指定的转换之后,操作数应具有相同的类型。2 如果至少一个操作数是一个指针,则对两个操作数都执行指针转换(4.10)和限定转换(4.4),以使其变为其复合指针类型(第5条)。比较指针的定义如下:如果两个指针都为null,都指向相同的函数或都表示相同的地址(3.9.2),则两个指针比较相等,否则,它们比较不相等。让我们逐点看一下:两个空指针比较相等。对您的理智有好处。指向同一函数的两个指针比较相等。其他任何事情都将非常令人惊讶。这也意味着任何inline功能只能有一个离线版本的地址,除非您想使功能指针比较非常复杂和昂贵。两者代表相同的地址。现在,这就是全部。将其删除并简化if and only if为一个简单的if解释就可以了,但这是使两个函数完全相同的明确要求,只要它不会改变一致性程序的可观察行为即可。
打开App,查看更多内容
随时随地看视频慕课网APP