Подтвердить что ты не робот

Кажется, что противоречие в §12.3.2/1 в стандарте С++ 11

С++ 11 Стандарт §12.3.2/1 (акцент мой):

A функция-член класса X, не имеющая параметров с именем формы

conversion-function-id:

оператор-тип-идентификатор

Тип конверсии:

type-specifier-seq conversion-declarator

conversion-declarator:

ptr-operator conversion-declarator

указывает преобразование из X в тип, указанный идентификатором типа преобразования. Такие функции называются преобразования. Нельзя указать тип возврата. Если функция преобразования является функцией-членом, тип функции преобразования (8.3.5) - это "функция без параметра, возвращающего идентификатор типа преобразования".

Является ли функция преобразования всегда функцией-членом, или есть случаи, когда это неверно?

4b9b3361

Ответ 1

Предложение "Если функция преобразования является функцией-членом", была добавлена ​​в рабочий черновик в N2798 как часть формулировки Concepts per N2773 Предлагаемая формулировка концепций. N2798 12.3.2/1 читает (я буду использовать жирный, чтобы показать дополнения, и outout, чтобы показать удаление):

1 Функция-член класса X , не имеющая параметров, или связанная функция понятия, единственным параметром которого является тип X, с имя формы

преобразования-функция-ID:

operator Тип конверсии

преобразования типа-ID:

type-specifier-seq атрибут-спецификатор opt конвертер-декларатор opt

конверсионного описатель:

ptr-operator conversion-declarator opt

указывает преобразование из X в тип, указанный идентификатором типа преобразования. Такие функции называются функциями преобразования. Классы, перечисления и typedef-имена не должны быть объявлены в спецификаторе type-seq. Не могут быть указаны ни типы параметров, ни тип Нет. Если функция преобразования является функцией-членом, t T Тип a функция преобразования (8.3.5) - это "функция, не возвращающая параметр, возвращающий тип преобразования- идентификатор" ; если функция преобразования является связанной функцией, тип функции преобразования - это "функция, принимающая параметр типа X, возвращающий идентификатор типа преобразования" . Функция преобразования никогда не используется для преобразования...

В тексте N2960 была снята формулировка понятий. "Если функция преобразования является функцией-членом", она также должна была быть удалена в то время, так как она теперь оставлена. Соответствующая часть N2960 §12.3.2/1:

1 Функция-член класса X, не имеющая параметров, или ассоциированная функция понятия, единственным параметром которого является тип X, с именем форма

преобразования-функция-ID:

operator Тип конверсии

преобразования типа-ID:

type-specifier-seq attribute-specifier opt conversion-declarator opt

конверсионного описатель:

ptr-operator conversion-declarator opt

указывает преобразование из X в тип, указанный идентификатором типа преобразования. Такие функции называются функциями преобразования. Нельзя указать тип возврата. Если функция преобразования является функцией-членом, тип функции преобразования (8.3.5) - это "функция без параметра, возвращающего идентификатор-тип-идентификатор" ; если функция преобразования является связанной функцией, тип функции преобразования - это "функция, принимающая параметр типа X, возвращающий идентификатор типа преобразования" ....

Ответ 2

Функция преобразования всегда является функцией (не static).

Слова "если" не присутствовали в С++ 98 или С++ 03. Я также не могу найти ссылку на него в списке отчетов о дефектах. Странно.


Как сказал Р. Мартиньо Фернандес , формулировка странная, но не противоречивая.