دو روز پیش داشتم با یک کتابخونهای کار میکردم (spdlog) که یکی از APIـهاش یک std::initializer_list میگرفت، امّا من یک std::vector داشتم؛ خواستم تبدیل کنم به std::initializer_list که با پیادهسازی عجیبغریبش توی ++libstd روبهرو شدم (قبلاً توی کتاب آقای استراستروپ، یک پیادهسازی خیلی سادهای رو دیده بودم، همچنین توی متن استاندارد که یک پیادهسازی براش نوشته بود). چرا عجیبغریب؟ خودتون ببینید:
فقط یک نگاه به Constructorهایی که داره بکنید ?. تنها Constructor قابل دسترسیش، Private هست. یعنی عملاً شما نباید بتونید هیچ شئای از این نوع درست بکنید. ولی خب ... میتونید. داخل سوألات StackOverFlow هم با جوابهایی مثل Template Hacking برای تبدیل std::vector به std::initializer_list روبهرو شدم. یک نفر داخل StackOverFlow جوابی با مضمون اینکه «این کلاس، یکی یه دونهٔ کامپایلر هست» داده بود. سراغ کدهای LLVM/Clang و GCC رفتم که و دیدم بله، ما واقعاً نمیتونیم حتیٰ یک کلاسی مثل std::initializer_list بنویسیم و این تماماً توی Compiler تنظیم شده که وقتی به یک Initialize List برخورد میکنه؛ اگه Overload مناسبش رو پیدا کرد، یک <std::initializer_list<T برای شما درست بکنه، که اینجا اون T میشه نوعی که شما دارید داخل Initialize Listـتون استفاده میکنید.
کامنتهایی که در جواب این سوألم نوشته شده جالبه:
https://stackoverflow.com/questions/68743469/why-we-need-a-private-constructor-for-stdinitializer-list
هرچند که من هنوز قانع نشدم که چرا باید این کلاس یک Private Constructor داشته باشه در حالی که حالت پیشنهادی استاندارد یه همچین چیزی نیست و اگر اینقدر سوگولی کامپایلر هست، برای چی موقع ارائه توی استاندارد ۱۱ این رو به عنوان یک Keyword یا حتیٰ یکی دیگه از حالات Initialization تبدیل نکردند؟ حس میکنم که یک قابلیّت زور-چاپونی هست ?.