Я просто пытаюсь проверить, разрешает ли компилятор имя типа в качестве имени переменной. Когда я пытался
int int;
, он сообщал об ошибке, говоря
ошибка C2632: «int», за которым следует «int», является недопустимым
, но когда я пытался
#include <string>
using namespace std;
int main()
{
string string;
}
, он не выдавал никакой ошибки.
string
и int
являются типами данных.
Почему компилятор допускает string
и не допускает int
?
EDIT : включает в себя обновление.
РЕДАКТИРОВАТЬ: Некоторые люди говорят, что int это не класс. В этом случае, почему допускается нижняя строка.
int a(10);
он работает аналогично конструктору класса.
string
не является зарезервированным словом C++
, но int
им является, и зарезервированное слово не может использоваться в качестве идентификатора.
И синтаксически нормально, чтобы имя класса и имя объекта совпадали.
class test {};
int main() {
test test; // test is an object of type test.
}
int
является ключевым словом C++. Во втором объявлении 'string string' объявляется объект типа 'std::string'
. После этого имя 'string' скрывает 'std::string'
в неквалифицированном поиске
#include <string>
using std::string;
int main(){
string string;
string s; // Error
}
int
является ключевым словом, тогда как string
является именем класса в стандартной библиотеке, но не является ключевым словом.
string
на самом деле не является «типом данных» в том же смысле, что и int
. int
является «собственным типом», поэтому текст «int» является ключевым словом.
string
- это просто "определяемый пользователем" класс (хотя здесь "пользователь" определен комитетом по стандартам C++). Но как таковая "строка" не ключевое слово.
Итак, int int
— это два ключевых слова вместе, а string string
просто определяет переменную с именем «string» типа «string». Компилятор C++ может сохранить два отдельных использования "string" прямо (но это не очень хорошая идея, поскольку, как вы продемонстрировали, программисты часто не могут).
Ну, учитывая, что другие по существу опубликовали ответ, я собираюсь опубликовать то, что я имел в виду...
Я предполагаю, что, поскольку второй ответ компилируется, что у вас использование пространства имен std;
в вашем файле (что в целом не очень хорошая идея; я не понимаю, почему люди советуют начинающим пользователям C++ делать это).
Когда компилятор переходит к разрешению первой строки
, он может найти класс в пространстве имен std
. Второе использование string
— это просто имя переменной.
Компилятор позволяет примитивным типам вести себя как классы для целей шаблонов — если бы вам приходилось везде специализироваться на примитивах, это был бы кошмар.