为什么auto y = reference_to_x的地址和x的地址不一样?
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
是 returned。当你 auto
result
时,它应该是对 another_var1
的引用变量,这是对 var1
的引用,即它们应该都具有相同的地址 - 它们是只需为同一内存命名别名。查看 Line 1
,15 被 return 编辑,给人一种他们都一样的错觉。然后,Line 2
反驳了这一点。
不过,我认为这可能是 auto
的问题。如果删除 auto
并将其替换为真正的 return 类型 long&
,您将获得预期的结果。
谁能解释一下到底发生了什么?
When you auto result
, it is supposed to be a reference variable to another_var1
这是您的错误。如果 result
应该是一个引用,那么你必须声明一个引用。像这样:
auto& result = fn2(var1, var2);
到底发生了什么
auto
从用于初始化它的变量类型推导出变量的类型1。我找不到任何人真正出来说它2,但我怀疑引用不是推导出来的,因为没有引用变量这样的东西。引用不作为独立实体存在。它们只是现有变量的一个方便的新名称 an alias。解决所有引用后
auto result = fn2(var1, var2);
还不如
fn2(var1, var2);
auto result = var1;
我怎样才能得到我想要的东西?
使用
将新变量声明为引用
auto & result = fn2(var1, var2);
如果您正在为 C++14 或更新的标准构建,decltype
can be used to track the returned type's value category, an lvalue reference,以保留参考。
decltype(auto) result = fn2(var1, var2);
1Gory details。请注意它如何使用与模板相同的推导规则。为什么要重复自己?
2No longer true。我应该知道最好不要忽略先与 Herb Sutter 或 Scott Meyers 核实。
假设您有以下代码:
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
是 returned。当你 auto
result
时,它应该是对 another_var1
的引用变量,这是对 var1
的引用,即它们应该都具有相同的地址 - 它们是只需为同一内存命名别名。查看 Line 1
,15 被 return 编辑,给人一种他们都一样的错觉。然后,Line 2
反驳了这一点。
不过,我认为这可能是 auto
的问题。如果删除 auto
并将其替换为真正的 return 类型 long&
,您将获得预期的结果。
谁能解释一下到底发生了什么?
When you
auto result
, it is supposed to be a reference variable toanother_var1
这是您的错误。如果 result
应该是一个引用,那么你必须声明一个引用。像这样:
auto& result = fn2(var1, var2);
到底发生了什么
auto
从用于初始化它的变量类型推导出变量的类型1。我找不到任何人真正出来说它2,但我怀疑引用不是推导出来的,因为没有引用变量这样的东西。引用不作为独立实体存在。它们只是现有变量的一个方便的新名称 an alias。解决所有引用后
auto result = fn2(var1, var2);
还不如
fn2(var1, var2);
auto result = var1;
我怎样才能得到我想要的东西?
使用
将新变量声明为引用auto & result = fn2(var1, var2);
如果您正在为 C++14 或更新的标准构建,decltype
can be used to track the returned type's value category, an lvalue reference,以保留参考。
decltype(auto) result = fn2(var1, var2);
1Gory details。请注意它如何使用与模板相同的推导规则。为什么要重复自己?
2No longer true。我应该知道最好不要忽略先与 Herb Sutter 或 Scott Meyers 核实。