typeid ( const typedef ) ?
От: Максим Рогожин Россия  
Дата: 12.11.10 09:36
Оценка:
Привет Всем!

Вот обнаружил какую-то странность в поведении typedef или typeid. Помогите разобраться, плиз.

#include <iostream>
#include <typeinfo>

using std::cout;
using std::endl;

typedef int Integer;
typedef const Integer ConstInteger;

int main() {
    cout << typeid(Integer).name() << endl;
    cout << typeid(ConstInteger).name() << endl;

    cout << (typeid(Integer) == typeid(ConstInteger)) << endl;
    
    Integer i = 1;
    i = 2;

    ConstInteger ci = 1;
    //ci = 2; // error C3892: 'ci' : you cannot assign to a variable that is const

    cout << (typeid(i) == typeid(ci)) << endl;

    return 0;
}



MSVC output:
int
int
1
1


Аналогично на GCC. Мне не понятно почему typeid говорит, что Integer и ConstInteger совпадают? Тем более, что ci все же является константой — присвоить ей 2 не удалось.
Re: typeid ( const typedef ) ?
От: Erop Россия  
Дата: 12.11.10 09:46
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Аналогично на GCC. Мне не понятно почему typeid говорит, что Integer и ConstInteger совпадают? Тем более, что ci все же является константой — присвоить ей 2 не удалось.


Патаму шта cv-квалификатор верхнего уровня не меняет тип. Ещё отличие [] и * и т. д...

Например, можно написать так:
class MyClass {
public:
    int foo( int );
};

int MyClass::foo( int const i )
{
    return i;
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: typeid ( const typedef ) ?
От: Юрий Жмеренецкий ICQ 380412032
Дата: 12.11.10 10:47
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет Всем!


МР>Вот обнаружил какую-то странность в поведении typedef или typeid. Помогите разобраться, плиз.

...

МР>Аналогично на GCC. Мне не понятно почему typeid говорит, что Integer и ConstInteger совпадают? Тем более, что ci все же является константой — присвоить ей 2 не удалось.


5.2.8/5
The top-level cv-qualifiers of the lvalue expression or the type-id that is the operand of typeid are always ignored.

Re[2]: typeid ( const typedef ) ?
От: Максим Рогожин Россия  
Дата: 12.11.10 11:59
Оценка:
Здравствуйте, Erop, Вы писали:

E>Патаму шта cv-квалификатор верхнего уровня не меняет тип. Ещё отличие [] и * и т. д...

Вон оно что. Спасибо.

E>Например, можно написать так:

class MyClass {
public:
    int foo( int );
};

int MyClass::foo( int const i )
{
    return i;
}

Хм... странно. А почему тогда нельзя написать так
class MyClass {
public:
    int foo();
};

int const MyClass::foo() {
    return 1;
}

?
Re[2]: typeid ( const typedef ) ?
От: Максим Рогожин Россия  
Дата: 12.11.10 12:00
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>

5.2.8/5
The top-level cv-qualifiers of the lvalue expression or the type-id that is the operand of typeid are always ignored.


Спасибо!
Re[2]: typeid ( const typedef ) ?
От: Masterkent  
Дата: 12.11.10 12:36
Оценка:
Erop:

E>Патаму шта cv-квалификатор верхнего уровня не меняет тип.


int и const int — это два разных типа.

E>Ещё отличие [] и * и т. д...


E>Например, можно написать так:
class MyClass {
E>public:
E>    int foo( int );
E>};

E>int MyClass::foo( int const i )
E>{
E>    return i;
E>}


Какое отношение трансформация типов параметров функций имеет к typeid?

#include <iostream>
#include <typeinfo>

int main()
{
    std::cout << int(typeid(int []) == typeid(int *)) << std::endl;      // 0
    std::cout << int(typeid(int [5]) == typeid(int [])) << std::endl;    // 0
    std::cout << int(typeid(int [5]) == typeid(int *)) << std::endl;     // 0

    std::cout << int(typeid(int const &) == typeid(int &)) << std::endl; // 1
}
Re[3]: typeid ( const typedef ) ?
От: Masterkent  
Дата: 12.11.10 12:41
Оценка:
Максим Рогожин:

МР>Хм... странно. А почему тогда нельзя написать так

МР>
МР>class MyClass {
МР>public:
МР>    int foo();
МР>};

МР>int const MyClass::foo() {
МР>    return 1;
МР>}
МР>

МР>?

Потому что, в отличие от типов параметров в типе функции, тип возврата не подвергается никаким трансформациям (см. 8.3.5/3).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.