Где стандарт говорит о псевдонимах? - PullRequest
5 голосов
/ 06 марта 2012

Где в стандарте C ++ говорится о псевдонимах? Я посмотрел на ToC и не увидел упоминания слова «псевдоним». Я попытался посмотреть в одном правиле определения (3.2), и поиск «псевдонима» не дал результатов. Я в недоумении, где это может быть. Я ищу псевдоним памяти

1 Ответ

10 голосов
/ 06 марта 2012

Псевдонимы в основном обсуждаются в §3.10 [basic.lval] / 10:

Если программа пытается получить доступ к сохраненному значению объекта через glvalue, отличный от одного из Для следующих типов поведение не определено: 52

  • динамический тип объекта,
  • cv-квалифицированная версия динамического типа объекта,
  • тип, аналогичный (как определено в 4.4) динамическому типу объекта,
  • тип, который является типом со знаком или без знака, соответствующим динамическому типу объекта,
  • тип, который является типом со знаком или без знака, соответствующим cv-квалифицированной версии динамического типа объекта,
  • агрегированный или объединенный тип, который включает один из вышеупомянутых типов среди своих элементов или не члены статических данных (включая, рекурсивно, элемент или нестатический член данных субагрегата или содержащий союз),
  • тип, который является (возможно, cv-квалифицированным) типом базового класса динамического типа объекта,
  • a char или unsigned char type.

52) Цель этого списка - указать те обстоятельства, при которых объект может или не может иметь псевдоним.

Так, например,

int x = 1;
*(char*)(&x);     // (implementation-)defined
*(unsigned*)(&x); // (implementation-)defined
*(float*)(&x);    // undefined

Следующие упоминания также могут быть интересными.

* * §5.17 одна тысяча тридцать восемь [expr.ass] / 8

Если значение, хранящееся в объекте, доступно из другого объекта, который каким-либо образом перекрывает хранилище первый объект, затем перекрытие должно быть точным, и оба объекта должны иметь одинаковый тип, в противном случае поведение не определено. [ Примечание : это ограничение применяется к отношениям между левой и правой сторонами операция присваивания; это не утверждение о том, как цель назначения может быть псевдонимом в генеральный. Смотри 3.10. - конечная нота ]

§17.6.4.9 [res.on.arguments] / 1 pt 3:

Если аргумент функции привязывается к ссылочному параметру rvalue, реализация может предполагать, что этот параметр является уникальной ссылкой на этот аргумент. … [ Реализация свободна для оптимизации проверок псевдонимов, которые могут потребоваться, если lvalue.]

§26.6.2 [valarray.syn] / 2:

Классы массива valarray определены как свободные от определенных форм псевдонимов, что позволяет выполнять операции с эти классы должны быть оптимизированы.

, а остальная часть <valarray> также обсуждает, как класс должен быть реализован, чтобы избежать наложения данных.

...