这个简短的程序是合法的C ++吗?

时间:2013-04-18 15:37:38

标签: c++ strict-aliasing

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 ++还是不是?我担心严格的混淆。

2 个答案:

答案 0 :(得分:7)

你提到了严格的别名 - 但strict aliasing is concerned with aliases of different types。它不适用于此。

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

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

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

答案 1 :(得分:1)

是的,这是合法的。

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

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