Привет Всем!
Вот обнаружил какую-то странность в поведении 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 не удалось.
Здравствуйте, Максим Рогожин, Вы писали:
МР>Аналогично на GCC. Мне не понятно почему typeid говорит, что Integer и ConstInteger совпадают? Тем более, что ci все же является константой — присвоить ей 2 не удалось.
Патаму шта cv-квалификатор верхнего уровня не меняет тип. Ещё отличие [] и * и т. д...
Например, можно написать так:
class MyClass {
public:
int foo( int );
};
int MyClass::foo( int const i )
{
return i;
}
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Максим Рогожин, Вы писали:
МР>Привет Всем!
МР>Вот обнаружил какую-то странность в поведении 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.
Здравствуйте, 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;
}
?
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>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.
Спасибо!
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
}
Максим Рогожин:
МР>Хм... странно. А почему тогда нельзя написать так
МР>МР>class MyClass {
МР>public:
МР> int foo();
МР>};
МР>int const MyClass::foo() {
МР> return 1;
МР>}
МР>
МР>?
Потому что, в отличие от типов параметров в типе функции, тип возврата не подвергается никаким трансформациям (см. 8.3.5/3).