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

    +13

    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
    //Сегодня QuestionGovno.
    //Допустим есть код:
    #include <iostream>
    using namespace std;
    class T{};
    struct M{M(T){}};
    struct G{G(T){}};
    
    int f(M){return 0;}
    bool f(G){return 0;}
    
    int main() {
    	bool a(f(T()));
    	return 0;
    }

    Казалось бы должна быть неоднозначность при компиляции, так как компилятор не знает какую перегрузку f бы выбрать.
    И как бы так оно и есть:
    http://ideone.com/o21NDg
    Логично? Логично.
    Но стандарт считает по другому:
    http://en.cppreference.com/w/cpp/language/overload_resolution
    Смотрите пункт:
    Best viable function
    F1 is determined to be a better function than F2 if implicit conversions for all arguments of F1 are not worse than the implicit conversions for all arguments of F2, and
    ...
    2) or. if not that, (only in context of non-class initialization by conversion), the standard conversion sequence from the return type of F1 to the type being initialized is better than the standard conversion sequence from the return type of F2

    Как мне повторить поведение, которое указано в стандарте?

    Запостил: LispGovno, 22 Ноября 2013

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

    • [Не вброс]C++[/Не вброс]
      Ответить
    • Кто-то по моему с перепоя слишком много сырцов буста начитался. Или был в 4х часовом R&D митинге. Эффект тот же: мозги на бекрень, начинают задаватся реторическим "что делать?"
      Ответить
      • Ну допустим я бустотравмирован, но как бы не суть.

        Суть вот в чем: Написано, что есть случаи, когда перегрузка функции выбирается исходя из наиболее подходящего возвращаемого значения функции (хотя мне кажется что это звучит глупо и я бы такое из стандарта бы выпер). На практике я такого никогда не видел. Вот и стало вдруг интересно как такого добиться? В коде bool не требует конверсии, а int требует прежде чем присваивать булу. Но выбора более подходящей перегрузки функции f по возвращаемому значению функции не произошло.
        Ответить
        • показать все, что скрыто— раздался пронзительный голос со стороны параши.

          Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?

          Петух — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его анус был разработан настолько, что он без труда мог спрятать в нём банку сгущёнки.
          Ответить
        • 1. cppreference.com не есть С++ стандарт, а всего-лишь его описание. посмотри в сам стандарт. там на неоднозначности и их разрешение иногда бывают примеры.

          2. компилеры по таким мелким мелочам тоже нередко глючат. на вывод только одного компилера не полагайся.
          Ответить
          • показать все, что скрыто— раздался пронзительный голос со стороны параши.

            Но пацаны, как всегда, не обратили внимания на это визгливое кукареканье. Пусть кукарекает, что с него взять?

            Петух — не человек, и сегодня ему предстоит очень трудная ночь. У него уже в течение полутора лет каждая ночь была очень трудной, и теперь его анус был разработан настолько, что он без труда мог спрятать в нём банку сгущёнки.
            Ответить
    • Я так и не понял. Быть или не быть? Говно в компиляторе или в стандарте? Надеюсь в стандарте. Звучит более фундаментально.
      Ответить
    • Дико, подозреваю, что на самом деле рассматривается данный расклад, а не конверсия из под-типов. http://ideone.com/2tL2xE
      И в стандарте собственно данный пункт написан как:

      the context is an initialization by user-defined conversion (see 8.5, 13.3.1.5, and 13.3.1.6) and the
      standard conversion sequence from the return type of F1 to the destination type (i.e., the type of the
      entity being initialized) is a better conversion sequence than the standard conversion sequence from
      the return type of F2 to the destination type.
      Ответить
      • Жаль дефекейстра больше нет с нами. Похоже на правду. В Интеле работаешь, а то я тебя где-то видел?
        Ответить
        • тебе вон думми00001 сразу все по делу написал - см. пример в стандарте
          он там есть, я вот посмотрел

          а жалеть нечего, в любом случае, жизнь - это тлен
          Ответить

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