Здравствуйте, Kluev, Вы писали:
K>С вложенным классом Storage::Blob такой номер не пройдет т.к. в языке С++ нет механизма опережающих описаний.Это баг уровня языка который нужно исправлять. Как бы вы тут не распинались, что это и не нужно.
K>
Здравствуйте, YuriV, Вы писали:
YV>Здравствуйте, Kluev, Вы писали:
YV>Правда что ли? Суждениями похож на любителя раста, те тоже рассуждают о том чего не знают.
YV>[ccode]
YV>class storage { YV>public: YV> class blob; YV>};
Так идея в том чтобы storage тоже имел "forward declaration" наряду с blob.
Это не идея, а непонимание. Полный тип в C++ это его имя и описание его структуры. А "forward declaration" объявляет лишь имя типа (incomplete type) структура которого сейчас неизвестна и поэтому получить доступ к структуре (storage::blob) incomplete type через его имя невозможно. Тут всё логично и никакой "дыры" в языке нет. Можно ввести в язык расширяемые классы, ну как namespace может расширяться в разных единицах трансляции новыми declaration/definition. Этакая альтернатива наследованию, но к чему это может привести прогнозировать сложно.
Здравствуйте, YuriV, Вы писали:
YV>Здравствуйте, Kluev, Вы писали:
K>>С вложенным классом Storage::Blob такой номер не пройдет т.к. в языке С++ нет механизма опережающих описаний.Это баг уровня языка который нужно исправлять. Как бы вы тут не распинались, что это и не нужно.
K>>
YV>Правда что ли? Суждениями похож на любителя раста, те тоже рассуждают о том чего не знают.
YV>Собирается gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), С++98,
YV>g++ main.cpp main_impl.cpp -o main
YV>Может это баг уровня твоего знания С++?
Сначала разберись, что здесь обсуждают, а потом уже лезь в разговор без хамства и перехода на личностей.
Здравствуйте, YuriV, Вы писали:
YV>Здравствуйте, Zhendos, Вы писали:
Z>>Так идея в том чтобы storage тоже имел "forward declaration" наряду с blob.
Z>>https://stackoverflow.com/questions/951234/forward-declaration-of-nested-types-classes-in-c
YV>Это не идея, а непонимание. Полный тип в C++ это его имя и описание его структуры. А "forward declaration" объявляет лишь имя типа (incomplete type) структура которого сейчас неизвестна и поэтому получить доступ к структуре (storage::blob) incomplete type через его имя невозможно. Тут всё логично и никакой "дыры" в языке нет. Можно ввести в язык расширяемые классы, ну как namespace может расширяться в разных единицах трансляции новыми declaration/definition. Этакая альтернатива наследованию, но к чему это может привести прогнозировать сложно.
Неверно. Вложенный тип не является частью типа, а находится в его пространстве имен.
Нет никаких проблем чтобы сделать опережающее описание следующим образом:
Здравствуйте, Kluev, Вы писали:
K>Здравствуйте, YuriV, Вы писали:
YV>>Здравствуйте, Zhendos, Вы писали:
Z>>>Так идея в том чтобы storage тоже имел "forward declaration" наряду с blob.
Z>>>https://stackoverflow.com/questions/951234/forward-declaration-of-nested-types-classes-in-c
YV>>Это не идея, а непонимание. Полный тип в C++ это его имя и описание его структуры. А "forward declaration" объявляет лишь имя типа (incomplete type) структура которого сейчас неизвестна и поэтому получить доступ к структуре (storage::blob) incomplete type через его имя невозможно. Тут всё логично и никакой "дыры" в языке нет. Можно ввести в язык расширяемые классы, ну как namespace может расширяться в разных единицах трансляции новыми declaration/definition. Этакая альтернатива наследованию, но к чему это может привести прогнозировать сложно.
K>Неверно. Вложенный тип не является частью типа, а находится в его пространстве имен. K>Нет никаких проблем чтобы сделать опережающее описание следующим образом:
K>
K>class storage;
K>class storage::blob;
K>
Верно. Объявление вложенного типа находиться внутри "member specification" или class body или пространства имён класса — как угодно, которое очевидно отсутствует в "forward declaration". Так что с точки зрения языка всё верно. Иначе чем nested typedefs лучше nested data members, тогда и их надо разрешить и методы и т.д. Такие вещи можно делать в темплейтных классах и то ограниченно. Например этот код не скомпилиться, потому что в точке использования тип C всё ещё неопределён.
template <typename T> struct A {
using type = typename T::C; // error
};
struct B : A<B> {
using C = int;
};
S>Если вы не в курсе, то STL допиливался до состояния, в котором его приняли в стандарт, несколько лет. И в 1996-1997-ом годах свободные реализации STL (вроде бы от RogueWare) уже активно использовались в продакшене.
RogueWave, если быть точным. В бормановском билдере 1, 3, и может и 5, например
K>Если вы не в курсе от раннего stl-мазохизма в продакшене активно отказывались и пересаживались на собственные разработки. Это уже веский повод не торопится с добавлением такой сомнительной библиотеки.
Если вы не в курсе, то к моменту даже раннего stl многие уже плотно сидели на своих велосипедах
Здравствуйте, T4r4sB, Вы писали:
S>>Но это не так. И авторы STL не единственные люди, которые считают, что размеры и индексы должны быть беззнаковыми.
TB>Вообще-то они уже признали, что это была ошибка.
Если под "они" подразумеваются авторы STL, то где об этом можно прочитать?
А вообще речь шла о том, что кроме авторов STL есть разработчики, которые находят логичным использование беззнаковых чисел для размеров и индексов. Т.е. авторы STL вовсе не были "белыми воронами".
Здравствуйте, Marty, Вы писали:
S>>Если вы не в курсе, то STL допиливался до состояния, в котором его приняли в стандарт, несколько лет. И в 1996-1997-ом годах свободные реализации STL (вроде бы от RogueWare) уже активно использовались в продакшене.
M>RogueWave, если быть точным. В бормановском билдере 1, 3, и может и 5, например
Некоторые умельцы прикручивали STL от RogueWave к Watcom 10 и 11.
Здравствуйте, so5team, Вы писали:
S>>>Если вы не в курсе, то STL допиливался до состояния, в котором его приняли в стандарт, несколько лет. И в 1996-1997-ом годах свободные реализации STL (вроде бы от RogueWare) уже активно использовались в продакшене.
M>>RogueWave, если быть точным. В бормановском билдере 1, 3, и может и 5, например
S>Некоторые умельцы прикручивали STL от RogueWave к Watcom 10 и 11.
Еще вот прямо сейчас смотрю в хидеры пятого кейла для арма, который ARMCC, а не ARMCLANG, и вижу
* Copyright (c) 1994-2001 Rogue Wave Software, Inc. All Rights Reserved.
YV>Верно. Объявление вложенного типа находиться внутри "member specification" или class body или пространства имён класса — как угодно, которое очевидно отсутствует в "forward declaration". Так что с точки зрения языка всё верно.
Неверно. Пространство имен класса очевидно присутствует в опережающем описании. Вот оно:
classstorage;
Поэтому нет никаких проблем с объявлением вложенного класса.
YV>Иначе чем nested typedefs лучше nested data members, тогда и их надо разрешить и методы и т.д.
У атрибутов смещение в объекте зависит от порядка декларации. Поэтому разрешить опережающее описание не статических атрибутов в рамках языка С++ невозможно.
Здравствуйте, so5team, Вы писали:
S>А вообще речь шла о том, что кроме авторов STL есть разработчики, которые находят логичным использование беззнаковых чисел для размеров и индексов. Т.е. авторы STL вовсе не были "белыми воронами".
Конечно есть. Даже если заставлять С++ников прямо жрать говно, то мне кажется чуть ли не половина начнёт доказывать, что так и надо и что там есть полезные витамины.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, so5team, Вы писали:
S>Здравствуйте, T4r4sB, Вы писали:
S>>>Но это не так. И авторы STL не единственные люди, которые считают, что размеры и индексы должны быть беззнаковыми.
TB>>Вообще-то они уже признали, что это была ошибка.
S>Если под "они" подразумеваются авторы STL, то где об этом можно прочитать?
S>А вообще речь шла о том, что кроме авторов STL есть разработчики, которые находят логичным использование беззнаковых чисел для размеров и индексов. Т.е. авторы STL вовсе не были "белыми воронами".
За этим "логичным" решением стоит целый лес граблей, ладно когда его не видит обычный разработчик, но когда "близорукость" у создателей стандарт пиши пропало.
Вот один из примеров. Допустим нужно перебрать все элементы кроме первого и последнего:
for (int i = 1; i < v.signed_size() - 1; i++)
{
v[i];
}
for (size_t i = 1; i < v.unsigned_size() - 1; i++)
{
v[i];
}
Со знаковым индексом пример всегда будет корректно работать, с беззнаковым на пустой коллекции ошибка времени выполнения.
Здравствуйте, Kluev, Вы писали:
K>Со знаковым индексом пример всегда будет корректно работать, с беззнаковым на пустой коллекции ошибка времени выполнения.
Здравствуйте, T4r4sB, Вы писали:
TB>Конечно есть. Даже если заставлять С++ников прямо жрать говно, то мне кажется чуть ли не половина начнёт доказывать, что так и надо и что там есть полезные витамины.
Любопытно. В сообщении, на которое вы ответили, был вопрос о том, где можно прочитать про признание ошибки. Так же, без упреков в чью-то сторону, было сказано, что есть люди, который находят смысл в беззнаковых индексах и размерах.
Ничего конструктивного и полезного вы не сказали, но зачем-то завели речь про "жрать говно".
И если опуститься на ваш уровень и продолжить разговор про "говно", то окажется, что наезжает и хамит so5team.