只要您不返回对本地/临时的引用,就没有问题。
此外,请务必检查随时间推移的引用的有效性(它在变体对象被破坏时结束,即当变体本身被破坏时,或者(!)当它重新初始化时)。
背景和解释
变体包含“当前”元素类型的对象,您可以完美地引用该对象。只要变量没有重新初始化为另一种元素类型(在这种情况下,引用“只是”悬空,就像被引用对象的生命周期结束时一样)。
因此,如果get_somet_t()
返回一个T&
或T const&
(或具有合适的隐式转换的东西)就没有问题。
在更简单的设置中,让我演示有效的选项:
variant<int, std::string> v1 = 42;
int& i1 = get<int>(v1); // returns by ref, valid
i1 *= 2;
// now v1 contains the updated integer value 84
同样,您甚至可以制作 /just references/ 的变体:
std::string s = "hello";
int answer = 42;
variant<int&, std::string&> v2(s);
get<std::string&>(v2) += " world"; // now s contains "hello world"
variant<int&, std::string&> v3(answer);
get<int&>(v3) *= 2; // now `answer` contains 84
在 Coliru 上看到这一切
示范
换句话说,以下是好的:
struct A { std::string a_property; };
struct B { std::string b_field; };
struct select_member : static_visitor<std::string&> {
std::string& operator()(A& a) const { return a.a_property; }
std::string& operator()(B& b) const { return b.b_field; }
};
int main()
{
variant<A,B> v = A { "some string" };
apply_visitor(select_member(), v) += " suffix";
std::cout << get<A>(v).a_property << "\n"; // prints "some string suffix"
}
也可以在 Coliru上看到它。