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

    +131.8

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    class Par_host_port
    {
    private:
            std::string vdata;
    public:
    //...
            char* get () { return (char*)vdata.c_str (); }
    };

    char const* превращается... Превращается char const*... В char*!

    Запостил: guest, 15 Июля 2009

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

    • Комментарий не понял. ПРикол-то не в том, что конст чар превращается в чар, а в том, что так вообще нельзя использовать c_str()
      Ответить
    • это же не просто каст. это каст особой, грязной магии.
      Ответить
    • Я тоже кое-чего не понял. Для убирания константы надо делать const_cast. Код же не будет компилиться?

      А вообще можно (но лучше не надо) делать так:

      vdata.c_str();
      return &vdata[0];

      :)
      Ответить
    • [quote=Говногость]Для убирания константы надо делать const_cast. Код же не будет компилиться?[/quote]

      c-style cast делает не только static_cast, но и const_cast и reinterpret_cast, иногда - два из этих.
      Ответить
    • [quote=Говногость]return &vdata[0];[/quote]

      А кстати. если я ничего не путаю, в новом стандарте это будет вполне легальным и рабочим, безо всяких предварительных c_str. в отличии от каста, снимающего константонсть, который останется вне закона.
      Ну кроме случая с пустой строкой.
      Ответить
    • А вообще можно (но лучше не надо) делать так:

      vdata.c_str();
      return &vdata[0];

      для строк это в общем случае неверно. а вот vdata.data() - другое дело.
      Ответить
      • vdata.data() может вернуть неnull-terminated string, как и &vdata[0]. Других проблем не вижу. Для какого общего случая неверно-то?
        Ответить

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