Ну, здесь есть несколько вещей. Чтобы выразить то, что вы просите напрямую, вы можете использовать что-то вроде std::variant<std::string, std::string&>
в качестве типа возвращаемой функции. Хотя я не проверял, может ли вариант хранить ссылку. Или какой-нибудь эквивалент из сторонней библиотеки. либо <>? Вы также можете написать собственную строку переноса класса и строку ref.
(не настоящий код)
struct StringOrRef {
enum class Type {Value, Ref} type;
union {
std::string value;
std::reference_wrapper<const std::string> ref;
};
...
};
Проверьте тему: различающее объединение в C ++.
Но я думаю, что в вашем примере есть большая проблема! Пожалуйста, рассмотрите право собственности на данные. std :: string становится владельцем переданных данных. Именно поэтому он копирует данные. Таким образом, когда ваша функция возвращает - вызываемый уверен, что у него есть данные, и ему не нужно беспокоиться об этом, пока он (а) удерживает значение.
В случае, если вы разрабатываете функцию, возвращающую ссылкупереданному значению аргумента - вам нужно убедиться, что значение используется в течение того же срока службы, что и переданный аргумент (для которого возвращается ссылка)
Итак, рассмотрим:
StringOrRef func(strging const& a, string const& b);
...
StringOrRef val;
{ // begin scope:
SomeStruct s = get_defaul();
val = func("some value", s.get_ref_to_internal_string());
}// end of val scope
val; // is in scope but may be referencing freed data.
Проблема здесь временного объекта SomeStruct s
. если ее функция-член get_ref_to_internal_string() -> string&
возвращает ссылку на строковое поле этого объекта (что часто является способом реализации) - тогда, когда s
выходит из области видимости, - ссылка становится недействительной. то есть - это ссылка на освобожденную память, которая может быть передана некоторым другим объектам. И если вы захватите эту ссылку в val
- val будет ссылаться на недействительные данные. Вам повезет, если все закончится access violation
или сигналом. В худшем случае ваша программа продолжится, но будет зависать случайно.