假设您有以下代码:
long& fn2(long& another_var1, long another_var2){
another_var1 = another_var1 + another_var2;
another_var2 = another_var2 + another_var1;
return another_var1;
}
int main (){
cout << boolalpha;
long var1 = 5;
long var2 = 10;
auto result = fn2(var1, var2);
cout << &result << endl;
cout << &var1 << endl;
cout << result << endl; //Line 1
cout << (&result == &var1) << endl; //Line 2
}
所有内容都按预期工作,直到您返回Line 2
,其中返回false
。当您auto
result
时,它应该是another_var1
的引用变量,它是对var1
的引用,即它们都应具有相同的地址 - 它们是只为同一内存命名别名。看着Line 1
,就会返回15,给人一种错觉,认为它们都是一样的。然后,Line 2
反驳了这一点。
但是,我认为这可能是auto
的问题。如果您删除auto
并将其替换为真实的返回类型long&
,则会获得预期的结果。
任何人都可以解释实际发生的事情吗?
答案 0 :(得分:5)
当你
的参考变量auto result
时,它应该是another_var1
这是你的错误。如果result
应该是引用,那么您必须声明引用。像这样:
auto& result = fn2(var1, var2);
答案 1 :(得分:1)
auto
从用于初始化 1 的变量类型中推导出变量的类型。我找不到任何人实际出来并说它 2 ,但我怀疑引用没有推断,因为没有引用变量这样的东西。引用不作为独立实体存在。对于现有变量,它们只是一个方便的新名称an alias。一旦所有引用都得到解决
auto result = fn2(var1, var2);
也可能是
fn2(var1, var2);
auto result = var1;
使用
将新变量声明为引用auto & result = fn2(var1, var2);
如果您正在构建C ++ 14或更新的标准,decltype
可用于跟踪返回类型的值类别lvalue reference,以保留引用。
decltype(auto) result = fn2(var1, var2);
1 Gory details。请注意它如何使用与模板相同的演绎规则。为什么重复自己?
2 No longer true。我应该知道最好不要先忽略Herb Sutter或Scott Meyers的检查。