искал как сломать ADL
От: reversecode google
Дата: 11.02.22 03:03
Оценка: 13 (2)
https://godbolt.org/z/n4rxdY1oM

msvc OK
gcc OK
clang error

че правда так можно ?
bb который ниразу не в name а в name::A, но компилер в экстазе?
template <typename T>
struct name
{
     struct A
     {
         int bb;
         int read() { return 0; }
     };

     struct B : public A
     {
         using name<T>::bb;
         void run()
         {
             bb = this->read();
         }
     };
};
Re: искал как сломать ADL
От: Андрей Тарасевич Беларусь  
Дата: 11.02.22 04:14
Оценка: 20 (1)
Здравствуйте, reversecode, Вы писали:

R>че правда так можно ?

R>bb который ниразу не в name а в name::A, но компилер в экстазе?

"Экстаз компилера" сразу прекращается при попытке инстанцировать `name<T>::B`. То есть компилятор просто считает, что проверку зависимого имени можно отложить.
Best regards,
Андрей Тарасевич
Отредактировано 11.02.2022 4:32 Андрей Тарасевич . Предыдущая версия .
Re[2]: искал как сломать ADL
От: reversecode google
Дата: 11.02.22 06:38
Оценка:
а черт забыл,да
но все таки его надо как то сломать во всех компилерах
не хочу я +10500 this-> или using лепить по всем дерайв классам

в msvc c++17 он как минимум был хорошо сломан
но в msvc с++20 его видимо починили
Re: искал как сломать ADL
От: σ  
Дата: 11.02.22 09:29
Оценка:
https://timsong-cpp.github.io/cppwp/n4868/temp.res.general#8.1

The program is ill-formed, no diagnostic required, if:
— no valid specialization can be generated for a template or a substatement of a constexpr if statement within a template and the template is not instantiated

Re[2]: искал как сломать ADL
От: reversecode google
Дата: 11.02.22 16:27
Оценка:
ну ладно кланг оказался более проворнее в данном случае

но потеря видимости методов и полей бейс класса в наследнике выглядит кособоко
я еще понимаю если бы там сложный шаблон был с наследованием
а так в пределах одного класса

зы там вроде в с++20(или в с++23 собирались?) ввели улучшения по дедукции вложенных типов в шаблонах ?
а фиг там
еще больше typename для вложенных типов пришлось добавить с включением c++20
вместо того что было c++17
Re[3]: искал как сломать ADL
От: Mr.Delphist  
Дата: 14.02.22 09:19
Оценка:
Здравствуйте, reversecode, Вы писали:

R>ну ладно кланг оказался более проворнее в данном случае


Не проворнее — делает работу, которую не надо. Есть подозрение, что на каких-то сценариях типа мудрёного SFINAE это может вылезти боком.
Шаблон пытаются инстанциировать? Нет? Тогда хоть на клингонском пусть написано, лишь бы на C++.
Re[2]: искал как сломать ADL
От: σ  
Дата: 14.02.22 13:28
Оценка:
R>>че правда так можно ?
R>>bb который ниразу не в name а в name::A, но компилер в экстазе?

АТ>"Экстаз компилера" сразу прекращается при попытке инстанцировать `name<T>::B`. То есть компилятор просто считает, что проверку зависимого имени можно отложить.


Ток вот `bb` в `name<T>::bb` это не зависимое имя.
Отредактировано 15.02.2022 13:30 σ . Предыдущая версия .
Re[4]: искал как сломать ADL
От: σ  
Дата: 15.02.22 10:56
Оценка:
MD>Шаблон пытаются инстанциировать? Нет? Тогда хоть на клингонском пусть написано, лишь бы на C++.
Что значит 'на C++'? Вот это на C++?
template<class T>
void g(T t) {
  +;
}
Re[5]: искал как сломать ADL
От: Mr.Delphist  
Дата: 15.02.22 12:13
Оценка:
Здравствуйте, σ, Вы писали:

MD>>Шаблон пытаются инстанциировать? Нет? Тогда хоть на клингонском пусть написано, лишь бы на C++.

σ>Что значит 'на C++'? Вот это на C++?
σ>
σ>template<class T>
σ>void g(T t) {
σ>  +; // ill-formed
σ>}
σ>


Это ill-formed С++ код, поэтому не скомпилируется. А вот так — уже well-formed:

template <typename T>
struct name
{
     struct A
     {
         int bb;
         int read() { return 0; }
         void m()
         {
             +"наша Маша громко плачет".fhtagn(); // well-formed
         }
     };
}

name<int>::A a;
// a.m(); // <- убрать комментарий, тогда ошибка компиляции
Re[6]: искал как сломать ADL
От: σ  
Дата: 15.02.22 13:27
Оценка:
MD>>>Шаблон пытаются инстанциировать? Нет? Тогда хоть на клингонском пусть написано, лишь бы на C++.
σ>>Что значит 'на C++'? Вот это на C++?
σ>>
σ>>template<class T>
σ>>void g(T t) {
σ>>  +; // ill-formed
σ>>}
σ>>


MD>Это ill-formed С++ код, поэтому не скомпилируется.


Это ill-formed, no diagnostic required код, а

If a program contains a violation of a rule for which no diagnostic is required, this document places no requirement on implementations with respect to that program.

Может и скомпилироваться.

Вообще код это слегка модифицированный пример из-под [temp.res.general]/8, который я цитировал в первом своём сообщении в этом треде.

template<class T> class X {
  // ...
  void g(T t) {
    +;              // may be diagnosed even if X​::​g is not instantiated
  }
};

Понимаешь, что значит may?

MD>А вот так — уже well-formed:

Если в MSVC молча скомпилировалось — не значит что well-formed. Хотя если совсем докапываться до формулировок, [temp.res.general]/8 говорит только про шаблоны, но не то, что в них, а (как хотя бы видно из примера под [temp.res.general]/8) имеет в виду вообще templated entities (это CWG1253).
Короче, GCC и Clang шлют лесом.

Таки что такое 'написано на C++'?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.