Информация об изменениях

Сообщение Re[8]: Неправильная кодогенерация, MSVC 2017 от 18.03.2020 9:21

Изменено 18.03.2020 10:01 rg45

Re[8]: Неправильная кодогенерация, MSVC 2017
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>То есть, если говорить прямо — это побочный эффект.


Наверное, можно и так сказать.

  Я тут еще немного ... пострадал хренью
КД>
КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1
КД>{
КД> public:
КД>  typedef TClass1                           self_type;

КД> public:
КД>  class tag_InnerClass;
КД>  class tag_InnerClass2;
КД>  class tag_InnerClass3;
КД>  class tag_InnerClass4;
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1::tag_InnerClass
КД>{
КД> public:
КД>  tag_InnerClass();
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>TClass1::tag_InnerClass::tag_InnerClass::tag_InnerClass::tag_InnerClass()
КД>{
КД>}

КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1::tag_InnerClass2
КД>{
КД> public:
КД>  tag_InnerClass2();
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>TClass1::TClass1::TClass1::TClass1::tag_InnerClass2::tag_InnerClass2::tag_InnerClass2::tag_InnerClass2()
КД>{
КД>}

КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1::tag_InnerClass3
КД>{
КД> private:
КД>  typedef tag_InnerClass3      self_type;

КД> public:
КД>  tag_InnerClass3();
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>TClass1::self_type::TClass1::self_type::self_type::tag_InnerClass3::self_type::tag_InnerClass3::self_type::self_type::tag_InnerClass3()
КД>{
КД>}

КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1::tag_InnerClass4
КД>{
КД> private:
КД>  typedef tag_InnerClass4      self_type;

КД>  self_type(const self_type&)=delete;
КД>  self_type& operator = (const self_type&)=delete;

КД> public:
КД>  self_type::self_type::self_type::self_type::self_type()=default;
  
КД> //~self_type(); //увы, но нет.
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>int main()
КД>{
КД> return 0;
КД>}

КД>//////////////////////////////////////////////////////////////////////////////
КД>

КД>VS2019 v16.4.6 компилирует без проблем.

КД>А вот тут ругаются на tag_InnerClass4.


Здесь может иметь значение, что self_type — определенное пользователем имя, все-таки, а не injected class name. Хоть концептуально они и похожи, наверное, могут обрабатываться с разной степенью строгости.
Re[8]: Неправильная кодогенерация, MSVC 2017
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>То есть, если говорить прямо — это побочный эффект.


Наверное, можно и так сказать.

  Я тут еще немного ... пострадал хренью
КД>
КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1
КД>{
КД> public:
КД>  typedef TClass1                           self_type;

КД> public:
КД>  class tag_InnerClass;
КД>  class tag_InnerClass2;
КД>  class tag_InnerClass3;
КД>  class tag_InnerClass4;
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1::tag_InnerClass
КД>{
КД> public:
КД>  tag_InnerClass();
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>TClass1::tag_InnerClass::tag_InnerClass::tag_InnerClass::tag_InnerClass()
КД>{
КД>}

КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1::tag_InnerClass2
КД>{
КД> public:
КД>  tag_InnerClass2();
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>TClass1::TClass1::TClass1::TClass1::tag_InnerClass2::tag_InnerClass2::tag_InnerClass2::tag_InnerClass2()
КД>{
КД>}

КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1::tag_InnerClass3
КД>{
КД> private:
КД>  typedef tag_InnerClass3      self_type;

КД> public:
КД>  tag_InnerClass3();
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>TClass1::self_type::TClass1::self_type::self_type::tag_InnerClass3::self_type::tag_InnerClass3::self_type::self_type::tag_InnerClass3()
КД>{
КД>}

КД>//////////////////////////////////////////////////////////////////////////////

КД>class TClass1::tag_InnerClass4
КД>{
КД> private:
КД>  typedef tag_InnerClass4      self_type;

КД>  self_type(const self_type&)=delete;
КД>  self_type& operator = (const self_type&)=delete;

КД> public:
КД>  self_type::self_type::self_type::self_type::self_type()=default;
  
КД> //~self_type(); //увы, но нет.
КД>};

КД>//////////////////////////////////////////////////////////////////////////////

КД>int main()
КД>{
КД> return 0;
КД>}

КД>//////////////////////////////////////////////////////////////////////////////
КД>

КД>VS2019 v16.4.6 компилирует без проблем.

КД>А вот тут ругаются на tag_InnerClass4.


Здесь может иметь значение, что self_type — определенное пользователем имя, все-таки, а не injected class name. Хоть концептуально они и похожи, наверное, могут обрабатываться по разным правилам и с разной степенью строгости.