Шаблоны и анонимный юнион
От: folk Россия  
Дата: 29.01.04 04:05
Оценка:
Есть шаблон, который должен параметризироваться только типами с тривиальными 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;};

Разъясните, плиз.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re: Шаблоны и анонимный юнион
От: folk Россия  
Дата: 29.01.04 06:23
Оценка: 15 (1)
Здравствуйте, folk, Вы писали:

F>Есть шаблон, который должен параметризироваться только типами с тривиальными ctor, dtor, copy ctor, copy ass op.

F>Как это проверить я вроде придумал, но не понимаю каким образом оно работает

F>
F>template <typename T>
F>class Foo
F>{
F>   typedef union {T t;} T_shall_be_trivial;    
F> public:   
F>    ...
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&>); }


Т.е. в предыдущем посте особые свойства анонимных объединений не играли роли. Имело значение только то, определяется ли новый тип.
Так что ли?
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[2]: Шаблоны и анонимный юнион
От: Кодт Россия  
Дата: 29.01.04 07:50
Оценка:
Здравствуйте, folk, Вы писали:

F>// псевдоним — проверяется при инстанциировании из включающего шаблона, и поэтому здесь ломаемся


Не знаю, правильно это или нет — но очень интересно!
Перекуём баги на фичи!
Re: Шаблоны и анонимный юнион
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 29.01.04 08:12
Оценка:
folk wrote:

> Есть шаблон, который должен параметризироваться только типами с

> тривиальными 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;};
>
> Разъясните, плиз.
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 (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[2]: Шаблоны и анонимный юнион
От: folk Россия  
Дата: 29.01.04 08:27
Оценка:
Здравствуйте, alnsn, Вы писали:

A>folk wrote:


>> Есть шаблон, который должен параметризироваться только типами с

>> тривиальными 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;};
>>
>> Разъясните, плиз.
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>не прокатит.

Да, я сюда тоже смотрел. Насколько я понимаю, здесь речь о данных-членах.
Но разве в моем примере сам юнион является данным-членом класса, порожденного из шаблона? Размер-то не увеличивается.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[3]: Шаблоны и анонимный юнион
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 29.01.04 09:13
Оценка:
folk wrote:

> Да, я сюда тоже смотрел. Насколько я понимаю, здесь речь о данных-членах.

> Но разве в моем примере сам юнион является данным-членом класса,
> порожденного из шаблона? Размер-то не увеличивается.
Недоглядел, прошу прощения
--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re: Шаблоны и анонимный юнион
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 29.01.04 09:27
Оценка:
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
...
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 (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[2]: Шаблоны и анонимный юнион
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 29.01.04 09:30
Оценка:
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 (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[2]: Шаблоны и анонимный юнион
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 29.01.04 09:40
Оценка:
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

Еще насчет комю. Изначально я на нем проверил. Это код там не прошел:
#include<string>
int main()
{
    Foo<std::string> foo;
}

А сейчас я проверил на g++ 3.2.2 там прошло (не проходит если убрать typedef
и сделать анонимное объединение членом класса).
Ты на чем проверял?

--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[3]: Шаблоны и анонимный юнион
От: folk Россия  
Дата: 29.01.04 09:48
Оценка:
Здравствуйте, 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>Ты на чем проверял?

VC7.1 и комо онлайн
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[4]: Шаблоны и анонимный юнион
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 29.01.04 10:13
Оценка:
folk wrote:

> VC7.1 и комо онлайн

Точно, eau во французском читается как о (manteau, chapeau и тд), а я как-то
с самого начала проассоциировал этот компилятор с Альбером Камю (наверно в
тот момент читал его), хотя он на самом деле Camus. Буду отвыкать теперь от
ю на конце

--
Александр Насонов,
Независимый консультант и разработчик ПО
alnsn-mycop@yandex.ru (для более быстрого ответа удалите -мусор из адреса)
Posted via RSDN NNTP Server 1.8 beta
Re[5]: Шаблоны и анонимный юнион
От: Кодт Россия  
Дата: 29.01.04 15:18
Оценка:
Здравствуйте, alnsn, Вы писали:

>> VC7.1 и комо онлайн

A>Точно, eau во французском читается как о (manteau, chapeau и тд), а я как-то
A>с самого начала проассоциировал этот компилятор с Альбером Камю (наверно в
A>тот момент читал его), хотя он на самом деле Camus. Буду отвыкать теперь от
A>ю на конце

При чём здесь Альбер? Цэ ж горилка недоперегнатая, коньяк то есть...
Перекуём баги на фичи!
Re[3]: Шаблоны и анонимный юнион
От: folk Россия  
Дата: 30.01.04 15:41
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, 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&>); }


VC7.1 хавает все, и это, имхо, правильно.
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.