столкнулся с одной неприятной вещью (не ожидал честно говоря) поэтому решил воспроизвести в минимизированном варианте. (Все оптимизации отключены, выпил анреференсед тоже отключён) Имеется VisualStudio 2017 15.6.4, на ней у меня прикручена LLVM 6.0.0 (Clang). Имеется следующий код: class base { int m_ba, m_bb, m_bc; public: base(int, int); }; base::base(int, int) : m_ba{ 3 }, m_bb{ 2 }, m_bc{ 1 } { } class derived : public base { int m_da, m_db; public: derived(); }; derived::derived() : base{ 1,2,3 }, m_da{ 7 }, m_db { 8 } // интересующее место, интеличенс палит тоже { } int main() { derived test{}; return 0; } при установленном платформтулсете LLVM-vs2014 – разумеется происходит ошибка компиляции, кленгу ненравится то что не то число аргументов при вызове родительского конструктора: 1>ddump.cpp(26,4): error : no matching constructor for initialization of 'base' 1> : base{ 1,2,3 }, m_da{ 7 }, m_db { 8 } // <E8><ED><F2><E5><F0><E5><F1><F3><FE><F9><E5><E5> <EC><E5><F1><F2><EE> 1> ^ ~~~~~~~~~ но если билдтулзы установлены стандартные - Visual Studio 2017 (v141), то есть микромягкий конпилер, то неожиданно всё собирается. Я сперва не понял — как так? Глянул что там нагенерилось, и оказалось что есть инициализация m_da{ 7 }, m_db { 8 } - и всё! рет! То есть нет ни кода вызова родительского конструктора, ни кода(как я сперва было подумал что cl решил сделать листинит просто, как структурных мемберов, мемберов родительского класса) ни этого самого лист-инита. Тоесть по завершении инициализации, test содержит 3 неинициализированных мембера родительского класса и 2 инициализированных в дочернем. Что за херня? У цланга в этом плане проблем нет. Кстати говоря, даже intellisense подсвечивает что мол-де ошибка с набором аргументов, но cl это похрен. есть идеи?
короче говоря, если ставить валидное число аргументов, например 2, как и должно быть ( : base{ 1,2,} ) - то код вызова конструктора родителя будет встроен. ежели 1, итд - то НЕТ. но ни ошибки ни предупреждения при этом не возникнет.
Код (Text): source_file.cpp(20): error C2661: 'base::base': no overloaded function takes 3 arguments Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
вот к чему пришёл: лист инит базовых мемберов будет, если все условия истинны: 1) все мемберы public 2) нет конструкторов 3) нет vft конструктор будет вызван только при совпадении набора аргументов. но всё равно, отсутствие ошибки/предупреждения - это нехорошо. и вот хз как, но у товарищ отписалшийся выше, ошибку таки выдало.
sn0w, 1. Так пока что низя. 2. Микрософтовский канпилер временами конпилет то, что конпилеться не должно. Например конпелит foo.get<float>() если foo зависит от шаблонного параметра (спойлер: в этом случае надо foo.template get<float>()).
законфирмили в технете кстати, сказали в следующем минорном релизе студии17 (в 15х такого кстати тоже не было) будет исправлено.