2016-01-29 4 views
3

При определении оператора преобразования, есть ли преимущество определенияоператор T &() или оператор T()?

operator T() const; 

над

operator T&(); 
operator const T&() const; 

Если предположить, что я не обеспокоен потенциальным прирост производительности при возвращении значения вместо ссылки.

+4

'оператор T &();' не похож на других. Предположительно, он вернет ссылку на члена класса; вызывающий может затем модифицировать упомянутый элемент. Другие два варианта этого не позволяют. –

ответ

3

Второй подход определенно лучше.

С первым подходом код вызова требуется, чтобы сделать копию возвращенного объекта, что может быть дорогостоящим.

При втором подходе код вызова имеет возможность делать или не делать копию.

Когда вы отвечаете за класс/библиотеку, вы не хотите нести ответственность за узкие места производительности, для которых они не являются обходными решениями.

Одним из основных недостатков второго подхода является то, что вызывающий код может быть оставлен с оборванным указателем/ссылкой. Чтобы помочь вашим пользователям, вам нужно четко документировать, как долго вернувшиеся ссылки действительны. Надеюсь, ваши пользователи будут внимательны и поступать правильно.

+4

С другой стороны, второй может быть использован для создания оборванных ссылок. Таким образом, для каждого есть плюсы и минусы. –

+0

@ M.M, пункт хорошо. –

+0

@ M.M Пользователь должен знать об этом, когда он создает ссылку или указатель. Это не относится к делу, заданному в вопросе. – Lingxi

3

Я думаю, это зависит от ситуации. Первый подход возвращает новый объект, который может быть изменен без изменения исходного объекта. Второй подход возвращает ссылку на существующий объект. Если вы измените этот объект, вы также измените исходный объект.

Какой из них подходит вам, вы должны решить; нет общего преимущества.

+0

Если объект не должен изменяться, пользователь должен 'const' квалифицировать его. Итак, если вы не хотите изменять оригинальный объект, сделайте вместо него копию. – Lingxi

+0

@Lingxi: почему вы задаете вопрос, а затем пытаетесь рассказать нескольким людям, отвечающим на вопрос, каким должен быть ответ? Спросите и * слушайте *, или не стесняйтесь публиковать свой собственный ответ и позволять другим читателям поднимать/понижать голос по его достоинствам ... это SO путь; -p. –

+1

@TonyD Спасибо, что упомянул об этом. Я буду помнить об этом и делать правильные вещи в следующий раз :-) – Lingxi

Смежные вопросы