Рассмотрим эти две функции:
void foo() {}
void bar() {}
гарантируется, что &foo != &bar
?
Аналогично,
template<class T> void foo() { }
гарантируется, что &foo<int> != &foo<double>
?
Есть два линкера, которые я знаю об этих определениях функции сгиба.
MSVC агрессивно сбрасывает функции COMDAT, поэтому две функции с одной и той же реализацией могут быть превращены в одну функцию. В качестве побочного эффекта две функции имеют один и тот же адрес. У меня сложилось впечатление, что это было незаконно, но я не могу найти, где в стандарте оно сделано незаконным.
Золотой линкер также сбрасывает функции с настройками safe
и all
. safe
означает, что при выполнении адреса функции он не складывается, а all
сбрасывается, даже если адрес берется. Таким образом, золотая складка safe
ведет себя как-если функции имеют разные адреса.
В то время как сворачивание может быть неожиданным, и есть код, который полагается на отдельные (идентичные реализации) функции, имеющие разные адреса (так что это может быть опасно сбрасывать), действительно ли это незаконно в соответствии с текущим стандартом С++? (С++ 14 в этой точке) (Естественно, что если safe
складка законна)