Още един въпрос относно претоварването на оператор []
в 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