объявление класса с ключевым словом struct и наоборот - PullRequest
4 голосов
/ 26 июня 2011

Но, конечно, мы даже не должны думать о таких вещах, я знаю, но все же это довольно интересно:

class A; //declaration
struct A {...}; //definition

struct B; //declaration
class B {...}; //definition

Когда я думаю об этом, я не вижу никаких проблем, если бы такая вещь действительно была разрешена (потому что структура и класс, по сути, одно и то же). Но так ли это (стандартно)?

MSVC принимает и компилирует его с предупреждением.

Ответы [ 2 ]

8 голосов
/ 26 июня 2011

Это разрешено в соответствии со стандартом, но, как об этом предупреждают некоторые компиляторы, это не очень полезно.

Я полагаю, что предупреждение было / было вызвано MSVC, использующим другое искажение имен для структур и классов, что сделало бы его еще менее полезным ...


По запросу от @Armen:

7.1.5.3 Разработанные спецификаторы типа, p3

... в любом подробном спецификаторе типа ключевое слово enum должно использоваться для ссылки на перечисление (7.2), ключ класса union должен использоваться для ссылки на объединение (пункт 9), а либо class или struct ключ класса должен использоваться для ссылки на класс (пункт 9), объявленный с использованием class или struct ключ класса .

5 голосов
/ 26 июня 2011

Согласно C ++ 03 Standard 9.1 - 2

"Определение класса вводит имя класса в область, где оно определено, искрывает любой класс, объект, функцию или другое объявление этого имени во вложенной области видимости (3.3). "

Таким образом, оно является действительным в соответствии со стандартом.

Немного поэкспериментируем с примером кода:

#include<iostream>

class A; //declaration 
struct A { int i;}; //definition  
struct B; //declaration 
class B {int j;}; //definition 

int main()
{
    A obj;
    obj.i = 10;
    B obj2;
    obj2.j = 10;
    std::cout<<"sizeof"<<sizeof(struct B);
    return 0;
}

Вот вывод:

prog.cpp: In function ‘int main()’:
prog.cpp:6: error: ‘int B::j’ is private
prog.cpp:13: error: within this context

Единственная разница между структурой и классом C ++ заключается в том, что доступ по умолчаниюспецификатор для структуры является общедоступным, а для класса - личным.

Итак, из приведенного выше примера:
В этом случае компилятор обрабатывает A как structure &
B какclass

Как видите, компилятор следует кавычке из стандарта, а тип с определением - это то, что компилятор распознает по типу объявления.

...