Я почему-то совершенно забыл про Волдеморт-типы и их поддержку в C++, а пару дней назад очень хотелось чего-нибудь такого.

Волдеморт-типы прекрасная вещь, во-первых, потому что они так называются. А называются они так потому, что их нельзя называть явно вне области их объявления.

Я так понимаю это изобретение из языка D, но благодаря распространению auto в C++14 это тоже реализуемо.

UPD. Я не написал const в 16 строке, о ужас

6 comments

В приведенном примере их полезность весьма сомнительна, так как результат вызова такой функции можн использовать только там где встречается auto и/или шаблонные параметры. И пришло нам это счастье еще из C :) только при отсутвии auto так их использовать не получится :)

Дальше начинается веселье, что чтобы получить вменяемую ошику копиляции нужно использовать SFINAE или контракты. Если мы хотим передавать результаты вызова таких "конструкторов" куда-то, но да можно. 

Если наследовать такую структру от чего-то конктертного, то можно создать на куче и вернуть указатель этого конкретного типа. И использовать это все до С++11 - ну а так как Волдеморт вполне себе типичный злодей, то и методы у него должны быть как у всех злодеев :)

P.S.
Конкретно в данном примере имя структуре можно не давать в принципе (выкинуть слово Voldemort) - должно скомпилироваться и так :)
Создание таких структур довольно широко исопльзовалось в С++ для имитации поведения похожего на нынешние лямды и патерна визитор до C++11. Ну это то, что я встречал :)
> UPD. Я не написал const в 16 строке, о ужас

ну в данном примере видно, что можификаци не производится, но возможно тебе захочется его модифицировать - так что норм :) Или без конст не ФП? :)

Кстати, часто используешь const * const в отношении указателей или вместо этого const & ?

Не забываешь ли делать аргументы функции констнтными, если они передаются по значению?
Aleksei Shashev
В приведенном примере их полезность весьма сомнительна, так как результат вызова такой функции можн использовать только там где встречается auto и/или шаблонные параметры. И пришло нам это счастье еще из C :) только при отсутвии auto так их использовать не получится :) Дальше начинается веселье, что чтобы получить вменяемую ошику копиляции нужно использовать SFINAE или контракты. Если мы хотим передавать результаты вызова таких "конструкторов" куда-то, но да можно.  Если наследовать такую структру от чего-то конктертного, то можно создать на куче и вернуть указатель этого конкретного типа. И использовать это все до С++11 - ну а так как Волдеморт вполне себе типичный злодей, то и методы у него должны быть как у всех злодеев :) P.S. Конкретно в данном примере имя структуре можно не давать в принципе (выкинуть слово Voldemort) - должно скомпилироваться и так :) Создание таких структур довольно широко исопльзовалось в С++ для имитации поведения похожего на нынешние лямды и патерна визитор до C++11. Ну это то, что я встречал :)
Пример полностью искусственный :) Да и эта фича, как и многие, сначала кажется уместной, а потом выясняется, что она не нужна.
Anton
Пример полностью искусственный :) Да и эта фича, как и многие, сначала кажется уместной, а потом выясняется, что она не нужна.
Фича имеет полезность, когда хочется запретить создание объекта из вне, просто есть и другие способы это сделать, так что why not :)
Anton
Стараюсь писать конст везде где можно. Хотя там, где по значению, могу и не писать :)
Хорошая практика 👍 с передачей по значению, раньше чаще, сейчас реже - передаваемые значения модифицировались и где-нибудь в конце функции уже не всегда легко можно было понять, а какое у них значение при беглом взгляде на код :)
Но на ревью иногда смотрели странно на такие сигнатуры функций, я имею ввиду если аргументы передаваемые по значение указаны как константы :)