Одна причина в том, что const
- это вирус.Это означает, что если часть кода является const-правильной, то остальная часть кода не будет взаимодействовать с этой частью.
Если вы игнорируете const-правильность, шансы ваших классов работают рука об рукус другими библиотеками (начиная со стандартной библиотеки) тонкие.
Например:
#include <vector>
#include <algorithm>
struct X
{
int n;
bool operator< (X b)
{
return n < b.n;
}
};
int main()
{
std::vector<X> vec;
std::sort(vec.begin(), vec.end());
}
С codepad.org
In function 'const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&) [with _Tp = X]':
/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2642: instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<X*, __gnu_norm::vector<X, std::allocator<X> > >, __gnu_debug_def::vector<X, std::allocator<X> > >, _Size = int]'
/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:2713: instantiated from 'void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<X*, __gnu_norm::vector<X, std::allocator<X> > >, __gnu_debug_def::vector<X, std::allocator<X> > >]'
t.cpp:17: instantiated from here
Line 90: error: no match for 'operator<' in '__a < __b'
Оператор сравнения, совместимый с stdlib, должендать обещание, что аргументы не изменены.Если бы объекты на самом деле изменялись во время их сравнения, попытка их сортировки была бы довольно бесполезной.
Другой пример: вы не сможете передавать аргументы по константной ссылке, что является традиционным способом передачи большихобъекты.Вместо этого вам придется передавать аргументы по изменяемым ссылкам.Теперь вы не сможете передавать временные функции в ваши функции.