2013-04-18 25 views
4

同時解決上http://cppquiz.org一個測試,我發現這個有趣的一段代碼:這個簡短的程序合法的C++嗎?

#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++或者它不是?我擔心嚴格的走樣。

+6

您是否嘗試過運行它? (我真的不確定你認爲什麼是非法的 - 事實是你將同一個論點兩次傳遞給一個函數?) –

+1

是的,這是合法的。爲什麼不呢? –

+2

AFAIK,這是合法的;這是不明智的,但它是合法的。 –

回答

7

您提到嚴格的別名 - 但是strict aliasing is concerned with aliases of different types。它不適用於此。

有沒有規則禁止此代碼。這是下面的代碼的道德等價的:

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

,或者更貼切,這相當於有幾個子節點指向同一個父節點樹數據結構。

+0

一棵樹的好例子。 :) – NoSenseEtAl

1

是的,這是合法的。

我可以正式證明它只能通過引用大部分C++標準文本。

您正在傳遞兩個引用,這兩個引用碰巧指向相同的對象,這非常好。然後,您將新值分配給該單個對象。還好。

+0

不,這裏*是*鋸齒。一個引用(實際上是一個指針)是一個別名。 –

+0

@KonradRudolph:你失去了我的「一個參考(實際上是一個指針)」。這裏沒有指針。 –

+0

@KonradRudolph:此外,我無法在標準中找到引用或指針爲「別名」的任何內容。請協助我進行搜索。 –