说我有:
f(T& t){ ... }
我有时想从函数调用中提供参数
T GetT() { ... }
像这样:
f(GetT())
即使我确信T
的生命周期保证会持续到表达结束,但我也无法将T&
更改为const T&
,因此无法编译我需要修改f
内的对象
我考虑过使用T&&
但是当我碰巧有T
左值时,我需要move()
它,这会让它变得尴尬,因为我有时需要使用T
致电f
之后。在我的情况下,T
是普通的旧数据,所以我想它会起作用但是移动对象并在之后使用它感觉不对。
是否有一种优雅的方法允许函数将rval和lval引用为可变对象?
ATM我正在做
T t = GetT();
f(t);
我觉得至少有一条无用的行和T
的无用副本。
答案 0 :(得分:1)
您当前正在进行的操作,即将对象存储在变量中,是延长返回对象生命周期并允许非const引用绑定到它的正确方法。如果GetT
被实现以便可以(N)RVO,则不需要进行无用的复制,因为它可以是elided。
答案 1 :(得分:1)
如何使用universal references。
不确定你是否会认为它很优雅,但它看起来像这样:
struct MyStruct
{
int i;
};
template<class T>
void foo(T&& t)
{
static_assert(std::is_base_of<MyStruct,
typename std::remove_reference<T>::type>::value, "ERROR");
t.i = 1024;
}
MyStruct GetMyStruct()
{
return MyStruct();
}
int main()
{
foo(GetMyStruct());
MyStruct ms;
foo(ms);
return 0;
}
答案 2 :(得分:0)
我想出了一个简单过载问题的解决方案:
f(T&amp; t){...}
f(T&amp; t){f(t); }
但仍需要更好的方法。
答案 3 :(得分:-1)
你不能绑定对temporany的引用:只有const引用才能这样做。
我建议您查看此链接C++11 binding rules for const &&