В стандарте С++ говорится о операторе равенства ==
:
[C++11: 5.10/1]:
[..] Два указателя одного типа сравнивают одинаковые, если и только если оба они равны нулю, оба указывают на одну и ту же функцию или оба представляют один и тот же адрес.
Моя первоначальная интерпретация заключалась в том, что функции не имеют семантически "адреса" как таковые на этом уровне, и поэтому "или оба представляют один и тот же адрес" могут быть предназначены только для обозначения объектов, а не функций. В противном случае зачем беспокоиться о статье "указать на ту же функцию"?
То есть, два указателя функций одного и того же типа сравниваются одинаково, если и только если обе указывают на одну и ту же функцию, период.
Следствием этого было бы то, что поведение, описанное в этом вопросе (указатели на две разные, но идентичные функции имеют одинаковые значения), будет ошибкой реализации, поскольку указатели для отдельных функций потребуется быть уникальным.
Я чувствую, что это цель предложения, но я не могу найти способ объективно защитить точку зрения, что именно так следует понимать значение прохода, или что это действительно было целью комитета, и теперь моя интерпретация поставила под вопрос:
[D] ссылается на меня, как "[...] или оба представляют один и тот же адрес". не удовлетворяет поведению Visual С++. (@jstine)
Поэтому мой вопрос касается намерения этого стандартного отрывка.
Или:
-
Я нахожусь на правильном пути: указатели на функции должны сравниваться, если они оба указывают на одну и ту же функцию ( "адреса" будут прокляты) или
-
В проходе есть избыточность: указатели на функцию должны сравнивать одинаковые, если оба они указывают на одну и ту же функцию или оба представляют один и тот же адрес; и, в свою очередь, реализации разрешено создавать две функции по одному и тому же адресу.
Что это?