Кресты / Говнокод #14525 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
#include <iostream>
using namespace std;

int main() {
	int i = 5;
	int* p1 = &i;
	volatile int* p2 = &i;
	cout << p1 << endl;
	cout << p2 << endl;
	return 0;
}

http://ideone.com/hpw4CB

Запостил: LispGovno LispGovno, (Updated )

Комментарии (23) RSS

    • прикольно

      интересно, какие были исторические причины запрета приведения volatile void * к const void *
      Ответить
      • А может быть, volatile появилось не сразу и про него забыли? Или психологический барьер не позволил сравнить такие непохожие сущности?
        Ответить
      • C.1.3 Clause 4: standard conversions [diff.conv]
        Сhange: Only pointers to non-const and non-volatile objects may be implicitly сonverted to void*
        Rationale: This improves type safety.
        Effect on original feature: Deletion of semantically well-defined feature.
        Difficulty of converting: Could be automated. A C program containing such an implicit conversion from, e.g., pointer-to-const-object to void* will receive a diagnostic message. The correction is to add an explicit cast.
        How widely used: Seldom.
        Ответить
          • В общем запрет приведения volatile ссылки/указателя к не-volatile приблизительно такие же как и у запрета приведения const к не-const: нарушение семантики. В случае volatile ты ожидаешь, что компилятор не будет оптимизировать обращение к переменной. А если ты передаёшь, скажем volatile переменную в функцию принимающую просто ссылку, ты не можешь гарантировать, что компилятор не закеширует переменную, чтобы не дёргать память или не оптимизирует запись, или что-то ещё, ведь определение функции пожет быть вообще скомпилировано другим компилятором в другое время.
            Ответить
  • Такая же ситуация, если использовать только одну переменную, т. е. можно обойтись приведением типа: cout << (volatile int *)p1 << endl; или cout << (int *)p2 << endl;

    std:cout по-разному реагирует на (int *) и на (volatile int *) — для него это разные типы.

    P.S. На слова const и static он почему-то так не реагирует.
    Ответить
    • ostream::operator<<() берёт указатели как const void*. volatile в конст неявно не преобразуются, соответственно самая близкая перегрузка это ostream::operator<<(bool), вот она и используется.
      Ответить
      • И снова придётся вспомнить о том, что слабая типизация не нужна. Если бы компилятор посылал куда подальше, не найдя точного соответствия, найти ошибку было бы легче.
        Ответить
          • Честно? Я и в готовом ПО не помню, когда последний раз это слово видел. Кажется, что-то было связано с обработкой исключительных ситуаций...
            Ответить
            • Для МК нужно, если переменную в прерывании трогаешь.
              Ответить
      • Тут не только конст, тут вообще отбрасывание volatile при передаче ссылки/указателя запрещено
        Ответить
      • Вброс возвращает вброс.
        Один вброс Страуструпа приводит к вбросу созданному в коде стандартной библиотеки гцц, который привел к вбросу на говнокоде. Осталось дождаться пока вброс на говнокоде приведет к очередному вбросу.
        А я ещё не верил в сюжет фильма Ёлки.
        Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8