我开始尝试理解C ++并与#34; undefined","未指定"混淆。
参考文献被广泛记录,但我没有找到我的特定"的答案。题。
通过引用传递的值的引用怎么样?
我已使用以下代码对此进行了测试:
#include <iostream>
int func(int& a)
{
int b=a;
++b;
std::cout << "[func] b: " << b << std::endl;
return b;
}
int func2(int& a)
{
int& b=a;
++b;
std::cout << "[func2] b: " << b << std::endl;
return b;
}
int main()
{
int a=1;
std::cout << "a: " << a << std::endl;
func(a);
std::cout << "a after func: " << a << std::endl;
func2(a);
std::cout << "a after func2: " << a << std::endl;
return 0;
}
得到了输出:
a: 1
[func] b: 2
a after func: 1
[func2] b: 2
a after func2: 2
它似乎做了我的期望,但这是标准规定的行为吗?
答案 0 :(得分:1)
从最新的公共标准草案http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf:
开始8.5.3参考文献[dcl.init.ref] 1一个被宣称为T&amp; S的变量。或T&amp;&amp;,即“对类型T的引用”(8.3.2),应由类型为T的对象或函数或可由对象初始化。 转换成T. [例如:
int g(int);
void f() {
int i;
int& r = i; // r refers to i
r = 1; // the value of i becomes 1
int* p = &r; //p points to i
int& rr = r; // rr refers to what r refers to, that is, to i
[...]
因此,虽然句子可能会留下一个不确定的(这里的相关部分可能是一个引用“可以转换为T”),但这个例子(这里的最后一行是相关的)是明确的。
答案 1 :(得分:0)
是的,这是标准行为。
当您通过引用传递某些内容时 - 实际上您只是为该变量分配了一个名称。
喜欢 -
当您使用main中的func(a)调用func2(int&amp; a)时,您将为变量指定一个新名称&#39; a&#39;主要定义。主要变量&#39; a&#39;被称为&#39; a&#39;在func2中。基本上fun2 :: a和main :: a引用相同的变量。
另外,当你这样做的时候 int&amp; B = A;在func2中,您为func2 :: a - &gt; func2 :: b创建了一个新名称。因此,变量保持不变,只添加新名称。
答案 2 :(得分:0)