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

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    Antony Polukhin
     in 
    pro.cxx
    Кстати, в EWG одобрили constexpr контейнеры http://open-std.org/JTC1/SC22/WG21/docs/papers/2018/p0784r1.html
    так что есть все шансы к С++20 писать:
    constexpr std::string result = foo();
    t.me/ProCxx
    /184343
    Mar 16 at 10:47

    Library pragmatism

    Current implementations of standard libraries sometimes perform various raw storage operations through interfaces other than the standard allocator and allocator traits. That may make it difficult to make the associated components usable in constexpr components. Based on a cursory examination of current practices, we therefore propose to start only with the requirement that the container templates in the [containers] clause be usable in constexpr evaluation, when instantiated over literal types and the default allocator. In particular, this excludes std::string, std::variant, and various other allocating components. Again, it is our hope we will be able to extend support to more components in the future.

    With regards to the default allocator and allocator traits implementation, the majority of the work is envisioned in the constexpr evaluator: It will recognize those specific components and implement their members directly (without necessarily regarding the library definition).
    We might, however, consider decorating the class members with the constexpr keyword. Also, some implementations provide extra members in these class templates (such as libc++'s allocator_traits<A>::__construct_forward ) that perform non-constexpr-friendly operations (memcpy, in particular). Lifting such members to standard status would help interoperability between library and compiler implementations.

    j123123, 16 Марта 2018

    Комментарии (10)
  2. C++ / Говнокод #23872

    +4

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    bool MyClass::operator==(int elem){
        if (list.isExist(elem)){
            list.remove(elem);
            return true; // Операция завершена успешно
        }
        return false; // Элемент elem не найден в списке
    }

    (C) https://www.linux.org.ru/forum/development/14063699?cid=14063991

    Вырвано из контекста (треда), но считаю данная кучка должна лежать здесь.

    Elvenfighter, 05 Марта 2018

    Комментарии (6)
  3. C++ / Говнокод #23854

    −1

    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
    #include <iostream>
    using namespace std;
    struct MyType { MyType() {  cout << __PRETTY_FUNCTION__ << endl; }};
    MyType& MyType() { cout << __PRETTY_FUNCTION__ << endl; }
    using MyType2 = struct MyType;
    int main() {
      // MyType t; <- error: expected ‘;’ before ‘t’
      MyType();
      struct MyType t;
      struct MyType t1 = MyType();
      struct MyType t2 = (struct MyType)::MyType();
      struct MyType t3 = MyType2();
      new(&t2) struct MyType();
      return 0;
    }

    Крестоблядство по мотивам #23850.
    https://ideone.com/XcK2hf.
    Особенно меня порадовал каст на 11 строчке.

    Bobik, 03 Марта 2018

    Комментарии (3)
  4. C++ / Говнокод #23850

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    MyType(const CopyPastedFromSomewhere&) = delete;
    MyType& operator=(const CopyPastedFromSomewhere&) = delete;
    
    MyType& operator=(const MyType*) = delete;
    
    // Winner?
    MyType& MyType(const MyType&) = delete;

    А что можно найти в вашей кодовой базе? К слову, выяснилось, что вариант

    void operator=(const MyType&) = delete;
    вполне себе допустим.

    roman-kashitsyn, 02 Марта 2018

    Комментарии (21)
  5. C++ / Говнокод #23836

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    #include <xmmintrin.h>
    
    void crasher() {
        constexpr __m128 w = {1,2,3,4};
        asm ("addps %[w], %[w]" : : [w] ""(w));
    }

    Крашим GCC
    https://ideone.com/iIAN0i

    Antervis, 28 Февраля 2018

    Комментарии (58)
  6. C++ / Говнокод #23835

    0

    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
    class PriceCache {
    public:
      FlightStorage(const std::size_t count) {
        for (std::size_t i = 0; i < count; ++i) {
          flights.emplace_back(FlightCache::get(i));
          prices.emplace_back(&flights.back(), Price::getFor(flights.back()));
        }
      }
    
    private:
      std::vector<Flight> flights;
      std::vector<const Flight *, double> prices;
    };

    "случайные сегфолты при обращении к PriceCache::prices"

    Elvenfighter, 28 Февраля 2018

    Комментарии (6)
  7. C++ / Говнокод #23802

    0

    1. 1
    return f() <= x->size() ? true:false;

    Классика?

    syoma, 20 Февраля 2018

    Комментарии (67)
  8. C++ / Говнокод #23801

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    // Read option name (can contain spaces)
         while (is >> token && token != "value")
    -        name += string(" ", name.empty() ? 0 : 1) + token;
    +        name += (name.empty() ? "" : " ") + token;

    terminate called after throwing an instance of 'std::length_error'
    what(): basic_string::_M_create


    Replacing string(" ", name.empty() ? 0 : 1) with (name.empty() ? "" : " ") and the same in the while() loop for value fixes the problem (for me).

    Does anyone know if "string(" ", 0)" is invalid C++ ?

    Кресты такие кресты.

    3.14159265, 18 Февраля 2018

    Комментарии (17)
  9. C++ / Говнокод #23715

    0

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    double x = 0, y;
    while (x < 1) {
        y = x;
        x += rand(0, 1);
    }

    Задача на теорию вореации и кобенаторику.
    rand - равномерное распределение
    Нужно найти матожидание y. С пруфами.

    3_dar, 07 Февраля 2018

    Комментарии (46)
  10. C++ / Говнокод #23711

    0

    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
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    // enum_helper_pre.h
    
    #ifndef delimiter 
        #define delimiter , 
    #endif 
     
     
    #ifndef enumeration_begin 
        #define enumeration_begin(arg) enum arg { 
    #endif 
     
    #ifndef enumeration_end 
        #ifdef last_enumerator 
            #define enumeration_end delimiter last_enumerator } 
        #else 
            #define enumeration_end } 
        #endif 
    #endif 
     
    #ifndef declare_member 
        #define declare_member(arg) arg 
    #endif 
     
    #ifndef member_value 
        #define member_value(arg) = arg 
    #endif 
    
    
    // enum_helper_post.h
    
    #undef delimiter 
    #undef enumeration_begin 
    #undef enumeration_end 
    #undef last_enumerator 
    #undef declare_member 
    #undef member_value
    
    
    // color.h
    
    #include "enum_helper_pre.h" 
     
    enumeration_begin(color) 
    declare_member(RED) member_value(-2) delimiter 
    declare_member(GREEN) delimiter 
    declare_member(BLUE) member_value(5) delimiter 
    declare_member(BRIGHTNESS) 
    enumeration_end; 
     
    #include "enum_helper_post.h"
    
    
    // main.cpp
    
    #include <iostream> 
    #include <string> 
    #include <boost/bimap.hpp> 
    #include <boost/preprocessor/stringize.hpp> 
     
    #include "color.h" 
     
    int main(int argc,char* argv[]) 
    { 
        typedef boost::bimap<color,std::string> map_type; 
        map_type color_map; 
        #define declare_member(arg) color_map.insert( map_type::value_type(arg,BOOST_PP_STRINGIZE(arg)) ) 
        #define delimiter ; 
        #define enumeration_begin(arg) 
        #define enumeration_end 
        #define member_value(arg) 
        #include "color.h" 
     
        std::cout<<color_map.left.at(RED)<<std::endl; 
        std::cout<<color_map.left.at(BLUE)<<std::endl; 
        std::cout<<color_map.right.at("GREEN")<<std::endl; 
        std::cout<<color_map.right.at("BRIGHTNESS")<<std::endl; 
        return 0; 
    }
    
    // Output
    
    RED 
    BLUE 
    -1 
    6

    Нарыл эту хуйню на http://www.quizful.net/post/enum-types-c

    j123123, 06 Февраля 2018

    Комментарии (2)