Запретить присвоение арифметические типы в std::string .

Khurshid Normuradov
Khurshid Normuradov

 

было бы хорошо если  добавили эту:

 


//Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64

 
#include <type_traits>

template< typename char_type>
   class basic_string
{
    
  public:
    
    basic_string& operator = (char c);
    
    template< typename T , class = typename std::enable_if< std::is_integral<T>::value && ! std::is_same<T, char_type>::value >::type >
    basic_string& operator = (T ) = delete;
};

typedef basic_string<char> string;
int main()
{
    string s;
    s = 'a';
    
    s = 23; // error C2280: 'basic_string<char> &basic_string<char>::operator =<int,void>(T)': attempting to reference a deleted function
        //with
        //[
        //    T=int
        //]
      //(15): note: see declaration of 'basic_string<char>::operator ='
}
3
рейтинг
6 комментариев
Antervis
тогда корректнее использовать char_type вместо char и is_convertible<T,char_type>::value вместо is_integral. Жаль, что такое нововведение может сломать существующий код, поэтому для начала надо пометить такие перегрузки как [[deprecated]] вместо = delete
Antervis
Andrey Davydov
Предлагаю в тот же proposal родственное изменение: добавить deleted конструктор, так чтобы
std::string s('c', 23);
не компилировалось. Люди путают порядок аргументов конструктора достаточно часто, чтобы в clang-tidy добавили проверку "misc-string-constructor".
Andrey Davydov
Andrey Davydov
К сожалению, это сломает такой валидный код:
void test(int digit)
{
string s;
s = '0' + digit; // 0 <= digit <= 9
}
Andrey Davydov
Khurshid Normuradov
Andrey Davydov,
Пусть сломает! В С++20 режиме !!! Посмотрим две случий:
1) Автор сможет редактировать код -- значить сломанный код пофиксид.
2) Автор не сможет редактирова код, т.е. это библиотека или чужой код, но развивающий (alive). В этом случий заранье предупредить об этом изменений чтобы не писали в С++20 такой код.
2.2) Здесь есть куча хороших библиотеки уже не развивающий - Вот они действительно может сломается -- надо анализировать сколько % код будет сломат , если это % больше определенное значение, можно хотябы добавить [deprecated], иначи сразу "= deleted".
Khurshid Normuradov
Antervis
Khurshid Normuradov, комитет стремится сохранить работоспособность всего легаси-кода.
Antervis
Raiden LuiKang
Лучше бы компиляторы добавили предупреждение такого присвоение. Или добавили [depricated] .
Raiden LuiKang
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).