Есть шаблон, который должен параметризироваться только типами с тривиальными ctor, dtor, copy ctor, copy ass op.
Как это проверить я вроде придумал, но не понимаю каким образом оно работает
template <typename T>
class Foo
{
typedef union {T t;} T_shall_be_trivial;
public:
...
};
Мне ясно, что члены анонимного юниона являются членами области, в которой юнион объявлен, но ведь этот анонимный юнион не является членом класса Foo, и поскольку псевдоним T_shall_be_trivial в дальнейшем нигде не используется, то и не должно происходить инстанциирования типа юниона.
Т.е. непонятно, почему проверка — typedef union {T t;} T_shall_be_trivial;
срабатывает в отличие от — union T_shall_be_trivial {T t;};
Здравствуйте, folk, Вы писали:
F>Есть шаблон, который должен параметризироваться только типами с тривиальными ctor, dtor, copy ctor, copy ass op. F>Как это проверить я вроде придумал, но не понимаю каким образом оно работает
F>
F>Мне ясно, что члены анонимного юниона являются членами области, в которой юнион объявлен, но ведь этот анонимный юнион не является членом класса Foo, и поскольку псевдоним T_shall_be_trivial в дальнейшем нигде не используется, то и не должно происходить инстанциирования типа юниона. F>Т.е. непонятно, почему проверка — typedef union {T t;} T_shall_be_trivial; F>срабатывает в отличие от — union T_shall_be_trivial {T t;};
F>Разъясните, плиз.
Кажется начинаю понимать.
template <typename T> struct A
{
// новый тип - инстанциирование происходит только если тип используется, и поэтому здесь не ломаемсяtypedef struct Named { T t[100]; } T1;
// псевдоним - проверяется при инстанциировании из включающего шаблона, и поэтому здесь ломаемсяtypedef struct { T t[100]; } T2;
};
size_t test() { return sizeof(A<int&>); }
Т.е. в предыдущем посте особые свойства анонимных объединений не играли роли. Имело значение только то, определяется ли новый тип.
Так что ли?
folk wrote:
> Есть шаблон, который должен параметризироваться только типами с > тривиальными ctor, dtor, copy ctor, copy ass op. Как это проверить я вроде > придумал, но не понимаю каким образом оно работает > >
> > Мне ясно, что члены анонимного юниона являются членами области, в которой > юнион объявлен, но ведь этот анонимный юнион не является членом класса > Foo, и поскольку псевдоним T_shall_be_trivial в дальнейшем нигде не > используется, то и не должно происходить инстанциирования типа юниона. > Т.е. непонятно, почему проверка — typedef union {T t;} T_shall_be_trivial; > срабатывает в отличие от — union T_shall_be_trivial {T t;}; > > Разъясните, плиз.
14.7.1 Implicit instantiation [temp.inst]
1 [...] and it causes the implicit instantiation of the definitions of
member anonymous unions.
Перед этой фразой много чего было, но все declaration. Извиняюсь, что не все
выдавил, скачанный acroread не работает, а xpdf не дружит с copy/paste.
Я пытался это прикрутить к has_trivial_destructor, но не вышло, SFINAE тут
не прокатит.
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Здравствуйте, alnsn, Вы писали:
A>folk wrote:
>> Есть шаблон, который должен параметризироваться только типами с >> тривиальными ctor, dtor, copy ctor, copy ass op. Как это проверить я вроде >> придумал, но не понимаю каким образом оно работает >> >>
>> >> Мне ясно, что члены анонимного юниона являются членами области, в которой >> юнион объявлен, но ведь этот анонимный юнион не является членом класса >> Foo, и поскольку псевдоним T_shall_be_trivial в дальнейшем нигде не >> используется, то и не должно происходить инстанциирования типа юниона. >> Т.е. непонятно, почему проверка — typedef union {T t;} T_shall_be_trivial; >> срабатывает в отличие от — union T_shall_be_trivial {T t;}; >> >> Разъясните, плиз. A>14.7.1 Implicit instantiation [temp.inst] A>1 [...] and it causes the implicit instantiation of the definitions of A>member anonymous unions. A>Перед этой фразой много чего было, но все declaration. Извиняюсь, что не все A>выдавил, скачанный acroread не работает, а xpdf не дружит с copy/paste. A>Я пытался это прикрутить к has_trivial_destructor, но не вышло, SFINAE тут A>не прокатит.
Да, я сюда тоже смотрел. Насколько я понимаю, здесь речь о данных-членах.
Но разве в моем примере сам юнион является данным-членом класса, порожденного из шаблона? Размер-то не увеличивается.
folk wrote:
> Да, я сюда тоже смотрел. Насколько я понимаю, здесь речь о данных-членах. > Но разве в моем примере сам юнион является данным-членом класса, > порожденного из шаблона? Размер-то не увеличивается.
Недоглядел, прошу прощения
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Comeau C++ 4.0
Pre-Release
User-Documentation
Dialects and Modes
C++ Language Accepted
...
6. An extension is supported to allow an anonymous union to be
introduced into a containing class by a typedef name — it needn't be
declared directly, as with a true anonymous union. For example:
typedef union {
int i, j;
} U; // U identifies a reusable anonymous union.class A {
U;// Okay -- references to A::i and A::j are allowed.
};
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
alnsn wrote:
> folk wrote: >> Разъясните, плиз. > > http://www.comeaucomputing.com/4.0/docs/userman/cpplang.html > > Comeau C++ 4.0 > Pre-Release > User-Documentation > Dialects and Modes > C++ Language Accepted
Не посмотрел на дату, 1997 год, так что отбой, надо все-таки рыться в
стандарте. Жаль времени нет. Вообще-то такая штуковина хороший кандидат в
concept check. Может она уже есть в нем?
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Здравствуйте, alnsn, Вы писали:
A>alnsn wrote:
>> folk wrote: >>> Разъясните, плиз. >> >> http://www.comeaucomputing.com/4.0/docs/userman/cpplang.html >> >> Comeau C++ 4.0 >> Pre-Release >> User-Documentation >> Dialects and Modes >> C++ Language Accepted
A>Еще насчет комю. Изначально я на нем проверил. Это код там не прошел: A>
A>#include<string>
A>int main()
A>{
A> Foo<std::string> foo;
A>}
A>
A>А сейчас я проверил на g++ 3.2.2 там прошло (не проходит если убрать typedef A>и сделать анонимное объединение членом класса). A>Ты на чем проверял?
folk wrote:
> VC7.1 и комо онлайн
Точно, eau во французском читается как о (manteau, chapeau и тд), а я как-то
с самого начала проассоциировал этот компилятор с Альбером Камю (наверно в
тот момент читал его), хотя он на самом деле Camus. Буду отвыкать теперь от
ю на конце
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Здравствуйте, alnsn, Вы писали:
>> VC7.1 и комо онлайн A>Точно, eau во французском читается как о (manteau, chapeau и тд), а я как-то A>с самого начала проассоциировал этот компилятор с Альбером Камю (наверно в A>тот момент читал его), хотя он на самом деле Camus. Буду отвыкать теперь от A>ю на конце
При чём здесь Альбер? Цэ ж горилка недоперегнатая, коньяк то есть...
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, folk, Вы писали:
F>>// псевдоним — проверяется при инстанциировании из включающего шаблона, и поэтому здесь ломаемся
К>Не знаю, правильно это или нет — но очень интересно!
Я уверен что правильно.
Согласно 14.7.1/1 при неявном инсанцировании шаблона класса инстанцируются все объявления, но не определения (с некоторыми исключениями, которые здесь не в тему).
Если определение не используется, то оно не генерируется, таким образом для структуры Named мы не должны получать ошибку.
typedef же является объявлением, но не определением, поэтому соответствующий тип инстанцируется, и мы должны получать ошибку.
Кстати, здесь Комо похоже глюкает — тоже выдает ошибку, хотя не должен:
template <typename T> struct A
{
typedef struct Named { T t[100]; } T1;
};
size_t test() { return sizeof(A<int&>); }
И непоследовательно хавает такое:
template <typename T> struct A
{
struct Named { T t[100]; };
typedef Named T1;
};
size_t test() { return sizeof(A<int&>); }