4

在解决http://cppquiz.org上的测试时,我发现了这段有趣的代码:

#include <iostream>

int f(int& a, int& b) {
    a = 3;
    b = 4;
    return a + b;
}

int main () {
    int a = 1;
    int b = 2;
    int c = f(a, a);// note a,a
    std::cout << a << b << c;
}

我的问题是这个程序是合法的 C++ 还是不是?我担心严格的混叠。

4

2 回答 2

7

你提到了严格的别名——但严格的别名与不同类型的别名有关。它不适用于这里。

没有禁止此代码的规则。这是以下代码的道德等价物:

int x = 42;
int& y = x;
int& z = x;

或者,更相关的是,它相当于让多个子节点引用树数据结构中的同一个父节点。

于 2013-04-18T15:43:59.767 回答
1

是的,这是合法的。

我只能通过引用大部分 C++ 标准文本来正式证明这一点。

您正在传递两个引用,这两个引用恰好引用同一个对象,这很好。然后,您依次为该单个对象分配新值。也很好。

于 2013-04-18T15:42:21.543 回答