在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 ++还是不是?我担心严格的混淆。
答案 0 :(得分:7)
你提到了严格的别名 - 但strict aliasing is concerned with aliases of different types。它不适用于此。
没有规则禁止此代码。这是以下代码的道德等价物:
int x = 42;
int& y = x;
int& z = x;
或者,更相关的是,它等同于让几个子节点引用树数据结构中的同一父节点。
答案 1 :(得分:1)
是的,这是合法的。
我只能通过引用大部分C ++标准文本来正式证明。
您正在传递两个引用,这两个引用都恰好引用同一个对象,这非常好。然后,依次为该单个对象分配新值。也没关系。