Почему «оператор void» не вызывается с синтаксисом броска?

Во время игры с этим ответом от пользователя GMan я создал следующий fragment (скомпилированный с Visual C ++ 9):

class Class { public: operator void() {} }; Class object; static_cast( object ); (void)object; object.operator void(); 

после перехода с отладчиком я обнаружил, что приведение в void не вызывает Class::operator void() , только третий вызов (с явным вызовом оператора) фактически вызывает оператор, эти две команды просто ничего не делают.

Почему operator void не вызывается с синтаксисом cast?

    Техническая причина, о которой говорится в п. 12.3.2:

    Функция преобразования никогда не используется для преобразования (возможно, cv-квалифицированного) объекта в (возможно cv-квалифицированный) тот же тип объекта (или ссылку на него), в (возможно, cv-квалифицированный) базовый class этого типа (или ссылка на него) или (возможно, cv-qualified) void .

    Обоснование (вероятно), чтобы позволить §5.2.9 / 4 работать:

    Любое выражение может быть явно преобразовано в тип «cv void». Значение выражения отбрасывается.

    (void)expr чтобы предположить, что он ничего не сделал для результирующего значения какого- либо выражения, но если он назвал ваш оператор преобразования, он ничего не отбрасывал. Поэтому они запрещают использование operator void в конверсиях.


    Почему бы не сделать его неправильным, чтобы идентификатор типа преобразования был void ? Кто знает, но имейте в виду, что это не совсем бесполезно:

     struct foo { operator void() { std::cout << "huh?" << std::endl; } }; typedef void (foo::*void_function)(); foo f; void_function func = &foo::operator void; (f.*func)(); // prints "huh" f.operator void(); // also does (which you knew) . struct foo { operator void() { std::cout << "huh?" << std::endl; } }; typedef void (foo::*void_function)(); foo f; void_function func = &foo::operator void; (f.*func)(); // prints "huh" f.operator void(); // also does (which you knew) 

    Это по-прежнему технически потенциально полезно для чего-то , поэтому, возможно, это достаточно логично, чтобы не сделать его плохо сформированным.

    Interesting Posts

    Как удалить черные границы после установки Windows 8?

    Форматирование кода Delphi

    Удаление динамически созданных элементов управления в C #

    Java: объект для байта и байт для конвертера объектов (для Tokyo Cabinet)

    Windows 7 – заморожен во время «запуска окон» DISK.SYS / CLASSPNP.SYS

    Как установить цвет для определенной строки, если определенные условия выполняются с помощью java?

    Каковы временные сложности различных структур данных?

    Как добавить пользователя Azure Active Directory в группу локальных администраторов

    ViewPager перехватывает все события onTouch по оси x. Как отключить?

    Перечисления Java, enums JPA и Postgres – Как мне заставить их работать вместе?

    Можно ли клонировать и загружать жесткий диск моего ноутбука на другой ноутбук?

    Захват параметров URL в request.GET

    Как преобразовать изображение растрового изображения низкого качества в вектор?

    Как получить NTFS, как поведение моментальных снимков в BTRFS?

    Совместное использование файлов в произвольных местах Dropbox

    Давайте будем гением компьютера.