1. C++ / Говнокод #17786

    +54

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    #include <iostream>
    using namespace std;
    
    struct Foo
    {
    	int i[0];
    };
    
    int main() {
    	// your code goes here
    	Foo f1;
    	Foo f2[5];
    	cout << sizeof(f1) << endl;
    	cout << sizeof(f2) << endl;
    	return 0;
    }

    http://rextester.com/NAA5246
    http://rextester.com/GKLFG82436
    http://rextester.com/SSZ22454
    http://rextester.com/ZEY11320

    Запостил: DlangGovno, 14 Марта 2015

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

    • Когда что-то смущает в реализациях, смотри Стандарт: 8.3.4/1
      If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero.
      Ответить
      • А когда смущает стандарт с таким количеством UB, идти к Тарасу?
        Ответить
        • Где ты тут увидел UB? Добавь -pedantic и получишь доп.инфу.
          http://coliru.stacked-crooked.com/a/3a61ae13c505257c
          Ответить
    • Интересный случай. f2 + 1 == f2 без перегрузки опереций.
      Ответить
      • >без перегрузки
        ?
        Ответить
        • Ну, обычно f2 + 1 > f2. Или f2 + 1 < f2. И только с перегрузкой "+" можно достичь такого эффекта.
          А тут оно ещё и логично, что странно.
          Ответить
          • для типа Foo не реализован оператор +. А стало быть его надо перегрузить, чтобы он вообще был.
            Ответить
            • Справедливо. Но f1 - это Foo*.

              Кстати,
              Foo f2[5];
              
              for(Foo* f=f2; f < f2 + 5; ++f) // ничего не делаем
                  cout << f << endl;
              
              for(Foo* f=f2; f <= f2 + 5 - 1; ++f) // зациклились
                  cout << f << endl;
              Ответить
              • > Но f1 - это Foo*.
                Наверное всё же имелось в виду f2. И f2 на самом деле не Foo*, а Foo[5]. Но про + я теперь понял :)
                Ответить
                • О чём вы? Пустые объекты в крестах всегда имеют размер больше нуля (если только это не наследование с Empty Base Optimization), чтобы у разных объектов были разные адреса.
                  Ответить
                  • О третьей и четвертой ссылке на rextester. И вытекающем оттуда следствии с инкрементом адресов.
                    Ответить
    • Ну gcc же намекает тебе: ISO C++ forbids zero-size array ‘i’. И вся эта поддержка массивов нулевой длины - всего лишь расширение для совместимости с сишкой.
      Ответить

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