2012-04-15 38 views
2

我在VS2010中遇到編譯錯誤,我不知道它是否應該被視爲一個編譯器錯誤或不:朋友模板類和lambda函數在Visual Studio 2010

我簡化了場景儘可能:模板類被聲明爲某個類的朋友,並嘗試訪問lambda函數內的朋友的私有成員。代碼如下:

class Foo { 
    template<typename T> friend class Bar; 
    int priv; 
}; 

template<typename T> 
class Bar { 
public: 

    void func() { 
     Foo foo; 
     foo.priv = 17; // compiles 
     auto lambda_func = [](Foo& _foo) { _foo.priv = 17; }; // doesn't compile 
    } 
}; 

void test() { 
    Bar<int> bar; 
    bar.func(); 
} 

請注意,只有當Bar是模板類時纔會發生這種情況。

+0

任何人都可以在其他編譯器上測試它嗎? – killogre 2012-04-15 08:19:05

回答

2

這在g ++ 4.6和4.7中編譯得很好。我認爲這是法律太---拉姆達應該有儘可能多的訪問,因爲它是在定義函數

C++的11個標準,5.1.2p7說,(強調):

的lambda表達式的複合語句產生函數調用操作符的函數體(8.4),但爲了名稱查找(3.4),確定這個(9.3.2)的類型和值以及將非表達式轉換爲非使用(* this)(9.3.1),將靜態類成員轉換爲類成員訪問表達式複合語句將在lambda表達式的上下文中考慮。

我讀到的意思是說,封閉塊內有效的任何東西在拉姆達體內都是有效的。

MSVC2010有lambda的其他錯誤,所以它不會讓我感到驚訝,它不能編譯這種情況。

+0

謝謝。我會將此轉發給Microsoft。 – killogre 2012-04-15 08:42:03

+0

更新:該錯誤已由Microsoft修復,該修補程序將在下一個版本中推出(未提供任何適當的數據) – killogre 2012-04-18 06:15:57