Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过引用传递的值的引用 我开始尝试理解C++,并与“未定义”、“未指定”混淆。_C++_Pass By Reference - Fatal编程技术网

通过引用传递的值的引用 我开始尝试理解C++,并与“未定义”、“未指定”混淆。

通过引用传递的值的引用 我开始尝试理解C++,并与“未定义”、“未指定”混淆。,c++,pass-by-reference,C++,Pass By Reference,参考文献被广泛记录,但我没有找到我“具体”问题的答案 对于一个通过引用传递的值的引用呢 我已使用以下代码对此进行了测试: #include <iostream> int func(int& a) { int b=a; ++b; std::cout << "[func] b: " << b << std::endl; return b; } int func2(int& a) { int&a

参考文献被广泛记录,但我没有找到我“具体”问题的答案

对于一个通过引用传递的值的引用呢

我已使用以下代码对此进行了测试:

#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;
}

它似乎达到了我的期望,但这是标准规定的行为吗?

是的,这是标准行为

当您通过引用传递某个内容时,实际上您只是为变量指定了一个以上的名称

像-

从main使用func(a)调用func2(int&a)时,将为main中定义的变量“a”指定一个新名称。在func2中,主变量“a”的名称为“a”。基本上fun2::a和main::a引用相同的变量

还有,当你
int&b=a;在func2中,您将为func2::a->func2::b创建一个新名称。因此,变量保持不变,只添加了新名称。

来自最新的公共标准草案:

8.5.3参考文献[dcl.初始参考文献] 1声明为T&或T&&的变量,即“引用类型T”(8.3.2),应通过类型T的对象或函数或可 转换为T[示例:


因此,虽然这个句子可能会留下一个不确定的部分(此处相关的部分可能是引用“可以转换为T”),但示例(此处最后一行相关)是明确的。

您可以从以下链接中找到好的答案


是的。这是标准行为。我会注意到这个答案是有用的,但我没有足够的声誉。感谢是简洁的——没有比我引用的主题更多的东西了。但是真正有用的是StruouStrup的C++语言,它在最新版本中已经覆盖了C++ 11.这与问题有关吗?是由一页上提到的另一个引用来初始化引用的吗?我相信不是,但是它们是冗长的,因为你不是更具体的,TL;Dr.-并且:你是否暗示了初始化是未定义的、未指定的或实现定义的?我可以向你们保证,因为我读了标准:它是不
a: 1
[func] b: 2
a after func: 1
[func2] b: 2
a after func2: 2
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
[...]