[英]Why does “const auto [x, y]” not behave as expected when binding to reference types?
[英]Why is the address of auto y = reference_to_x not the same as the address of x?
假设您有以下代码:
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&
,则会得到预期的结果。
任何人都可以解释真正发生的事情吗?
当你
auto result
,它应该是another_var1
的引用变量
这是你的错误。 如果result
应该是引用,那么您必须声明引用。 像这样:
auto& result = fn2(var1, var2);
auto
从用于初始化它的变量类型中推导出变量的类型1 。 我找不到任何人实际出来并说它2 ,但我怀疑引用不推断,因为没有参考变量这样的东西。 引用不作为独立实体存在。 对于现有变量,它们只是一个方便的新名称, 别名 。 一旦所有引用都得到解决
auto result = fn2(var1, var2);
也许是
fn2(var1, var2);
auto result = var1;
将新变量声明为引用
auto & result = fn2(var1, var2);
如果要构建C ++ 14或更新的标准,则可以使用decltype
跟踪返回类型的值类别( 左值引用 )以保留引用。
decltype(auto) result = fn2(var1, var2);
1 Gory细节 。 请注意它如何使用与模板相同的演绎规则。 为什么重复自己?
2 不再是真的 。 我应该知道最好不要先忽略Herb Sutter或Scott Meyers的检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.