Вопрос

Согласно стандарту C ++ 03, действителен ли есть ссылки на неполные типы? Я не знаю никакой реализации, которая реализует ссылки как любые, кроме не нулевых указателей, поэтому такой код должен работать. Тем не менее, мне интересно, являются ли ссылки на неполные типы стандартными соответствующими.

Я был бы признателен за ответы с цитатами и ссылками на стандарт C ++.

Это было полезно?

Решение

Стандарт C ++ явно не говорит, насколько я знаю, что вы можете иметь ссылку на неполный тип. Но в стандарте есть раздел, который указывает, когда тип должен быть завершенным:

3.2 Одно правило определения [basic.def.odr

4. Точное одно определение класса требуется в блоке перевода, если класс используется таким образом, чтобы тип класса был завершен. [Пример: Следующая полная единица перевода хорошо сформирована, хотя никогда не определяется X:

    struct X;     // declare X as a struct type
    struct X* x1; // use X in pointer formation
    X* x2;        // use X in pointer formation

- Определенный пример] [Примечание: Правила для объявлений и выражений описывают, в которых требуются контексты полных типов классов. Тип класса T Должен быть завершен, если:

  • объект типа T определяется (3.1, 5.3.4), или
  • преобразование LVALUE в RVALE применяется к LVALUE, ссылаясь на объект типа T (4.1), или
  • Выражение конвертируется (неявно или явно) в тип T (пункт 4, 5.2.3, 5.2.7, 5.2.9, 5.4), или
  • выражение, которое не является константой нулевого указателя и имеет тип, кроме void * преобразуется в указатель типа на T или ссылка на T используя неявное преобразование (пункт 4), dynamic_cast (5.2.7) или static_cast (5.2.9), или
  • оператор доступа к классу применяется к выражению типа T (5.2.5), или
  • а typeid оператор (5.2.8) или sizeof Оператор (5.3.3) применяется к операнду типа T, или же
  • функция с типом возврата или типа аргумента типа T определяется (3.1) или называется (5.2.2), или
  • LVALUE типа T назначается (5.17).

Похоже, что в любом другом случае, включая объявления ссылок на неполные типы, тип может быть неполным.

Другие советы

§15.1.3 говорит

Тип экспрессии бросания не должен быть неполным типом или указателем или ссылкой на неполный тип, кроме void*, const void*, volatile void*или const volatile void*.

Что, кажется, подразумевает, что вы можете иметь ссылку на неполный тип.

Я еще не совсем хорош в интерпретации стандарта, так что возьмите это так.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top