че правда так можно ?
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();
}
};
};
Здравствуйте, reversecode, Вы писали:
R>че правда так можно ? R>bb который ниразу не в name а в name::A, но компилер в экстазе?
"Экстаз компилера" сразу прекращается при попытке инстанцировать `name<T>::B`. То есть компилятор просто считает, что проверку зависимого имени можно отложить.
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
ну ладно кланг оказался более проворнее в данном случае
но потеря видимости методов и полей бейс класса в наследнике выглядит кособоко
я еще понимаю если бы там сложный шаблон был с наследованием
а так в пределах одного класса
зы там вроде в с++20(или в с++23 собирались?) ввели улучшения по дедукции вложенных типов в шаблонах ?
а фиг там
еще больше typename для вложенных типов пришлось добавить с включением c++20
вместо того что было c++17
Здравствуйте, reversecode, Вы писали:
R>ну ладно кланг оказался более проворнее в данном случае
Не проворнее — делает работу, которую не надо. Есть подозрение, что на каких-то сценариях типа мудрёного SFINAE это может вылезти боком.
Шаблон пытаются инстанциировать? Нет? Тогда хоть на клингонском пусть написано, лишь бы на C++.
R>>че правда так можно ? R>>bb который ниразу не в name а в name::A, но компилер в экстазе?
АТ>"Экстаз компилера" сразу прекращается при попытке инстанцировать `name<T>::B`. То есть компилятор просто считает, что проверку зависимого имени можно отложить.
Ток вот `bb` в `name<T>::bb` это не зависимое имя.
Здравствуйте, σ, Вы писали:
MD>>Шаблон пытаются инстанциировать? Нет? Тогда хоть на клингонском пусть написано, лишь бы на C++. σ>Что значит 'на C++'? Вот это на C++? σ>
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 шлют лесом.