Еще один вопрос по перегрузке оператора []
в C ++, в частности его const
версии.
Согласно странице cppreference о перегрузке оператора, при перегрузке оператора индексации массива
struct T { value_t& operator[](std::size_t idx) { return mVector[idx]; } const value_t& operator[](std::size_t idx) const { return mVector[idx]; } };
Если известно, что тип значения является встроенным, вариант const должен возвращаться по значению.
Итак, если value_t
является встроенным типом, вариант const
должен выглядеть
const value_t operator[](std::size_t idx) const { return mVector[idx]; }
или возможно даже
value_t operator[](std::size_t idx) const { return mVector[idx]; }
поскольку квалификатор const
не очень полезен для такого возвращаемого значения.
Теперь у меня есть шаблон class T
(чтобы сохранить то же имя, что и в ссылке), который используется как со встроенными типами данных, так и с пользовательскими типами, некоторые из которых могут быть тяжелыми.
template<class VT>
struct T
{
VT& operator[](std::size_t idx) { return mVector[idx]; }
const VT& operator[](std::size_t idx) const { return mVector[idx]; }
};
Согласно приведенному выше совету, я должен использовать enable_if
с некоторыми type_traits
, чтобы различать между экземплярами шаблонных классов со встроенными / не встроенными типами.
Я должен это делать? Эта рекомендация только для того, чтобы избежать потенциального ненужного разыменования для встроенных типов, или за ней скрывается что-то еще, о чем следует знать?
Примечания:
- этот класс активно участвует в горячей части кода, экземпляры которого создаются как встроенными, так и настраиваемыми типами.
- код используется кроссплатформенным с несколькими компиляторами с разной степенью оптимизации.
- таким образом, я заинтересован в том, чтобы сделать его правильным и портативным, а также во избежание любого потенциального ущерба для производительности.
- Мне не удалось найти никаких дополнительных рассуждений в стандарте C ++, но чтение standardeze не является моей самой сильной стороной.
Существующие вопросы по StackOverflow:
- В разделе часто задаваемых вопросов C ++ об основных правилах и идиомах для перегрузки операторов рекомендуется возвращать копию с использованием конструкции «лучше» без явного обоснования. Это "должно быть лучше" немного отличается от "должно" на странице cppreference. и еще больше усугубляет мое замешательство.
- это и это поговорим о перегрузке const в принципе; однако не о той детали, которая меня интересует. Кроме того, в первом используется
const value_t&
, а во второмconst value_t
.
value_t
должен вести себя иначе? - person walnut   schedule 17.12.2019enable_if
- person Anton Menshov   schedule 17.12.2019