Оператор C ++ & lt; () ok в gcc, но clang дает много ошибок, как его исправить? [Дубликат]

2
задан deepdive 29 May 2014 в 07:22
поделиться

2 ответа

Маркировка функции as const обещает, что она не изменит объект. Поэтому он может использоваться для объектов const.

STL почти наверняка принимает аргументы как const, потому что это разумная вещь.

Не должно мешать вам определить operator< как const, потому что я не могу представить, что у меня есть меньше оператора, который меняет объект. Это было бы просто глупо.

Если вы хотите точно знать, где именно находится код, скопированный из libstdc ++ bits / stl_algo.h на машине Fedora 20:

  /// This is a helper function...
  template<typename _RandomAccessIterator, typename _Tp, typename _Compare>
    _RandomAccessIterator
    __unguarded_partition(_RandomAccessIterator __first,
                          _RandomAccessIterator __last,
                          const _Tp& __pivot, _Compare __comp)

const _Tp& __pivot, прямо там.

5
ответ дан Zan Lynx 4 September 2018 в 08:32
поделиться

Стандарт немного неясен в этом, но [alg.sorting] дает два намека на то, почему этот отказ от компиляции может быть стандартно-совместимым поведением. Первый - [alg.sorting]/2:

... Предполагается, что comp не будет применять какую-либо непостоянную функцию через разыменованный итератор.

Далее нам сообщают, что когда компаратор не поставляется [alg.sorting]/3:

... comp(*i, *j) != false по умолчанию *i < *j != false

, поскольку в ваш случай, comp по умолчанию *i < *j != false, и это применит неконстантную функцию к разыменованным итераторам. Это делает недействительным предположение, данное в [alg.sorting]/2, и поэтому ваш код имеет неопределенное поведение. Это законно для кода с неопределенным поведением, чтобы не компилировать.

3
ответ дан Mankarse 4 September 2018 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: