簡體   English   中英

函數本地typedef在C ++ 0x lambdas中是否可見?

[英]Are function-local typedefs visible inside C++0x lambdas?

我遇到了一個奇怪的問題。 以下簡化代碼重現了MSVC 2010中的問題:

template <typename T>
struct dummy
{
    static T foo(void) { return T(); }
};

int main(void)
{
    typedef dummy<bool> dummy_type;
    auto x = []{ bool b = dummy_type::foo(); };
    // auto x = []{ bool b = dummy<bool>::foo(); }; // works
}

我在函數中本地創建的typedef似乎在lambda中不可見。 如果我將typedef替換為實際類型,它將按預期工作。

以下是一些其他測試用例:

// crashes the compiler, credit to Tarydon
int main(void)
{
    struct dummy {};

    auto x = []{ dummy d; };
}

// works as expected
int main(void)
{
    typedef int integer;

    auto x = []{ integer i = 0; };
}

我現在還沒有可用於測試它的g ++。 這是C ++ 0x中的一些奇怪的規則,還是編譯器中的一個錯誤?

從上面的結果來看,我傾向於bug。 雖然崩潰肯定是一個錯誤。


目前,我已經提交了兩份錯誤報告

上面的所有代碼片段都應該編譯。 該錯誤與在本地定義的范圍上使用范圍解析有關。 (由dvide發現。)

崩潰的bug與...誰知道。 :)


更新

根據錯誤報告 ,它們都已針對Visual Studio 2010的下一個版本進行了修復。(雖然情況似乎並非如此;也許是VS11。)

從n3000,5.1.2 / 6,

lambda-expression的復合語句產生函數調用操作符的函數體(8.4),但出於名稱查找(3.4)的目的,...在lambda表達式的上下文中考慮復合語句。

毫不奇怪,本地類型應該是可見的。

lambdas也無法檢測到函數本地枚舉。

int main()
{   
    enum E {A, B, C};   
    auto x = [](){ int a = A; }; 
    //auto y = [](){ E a = A; }; // this will crash the compiler
}

錯誤C3493:無法隱式捕獲“A”,因為未指定默認捕獲模式

以下是一個工作場所,有問題 - 可能。

int main()
{   
    enum E {A, B, C};   
    auto x = [=](){ int a = A; };
    // typedef E F; 
    // auto y = [=](){ F a = A; }; // this compiles ok
}

這不是你問題的真正答案,而是進一步探討問題。 我想知道編譯器是否有處理在封閉范圍內聲明的類型的問題,所以嘗試了這個:

#include <iostream>

template <typename Func>
void do_test(Func pFunc) {
}

template <typename T>
void test_trait(void) {
   class Something { public: int foo; };

   do_test ([] (T pX) {
      Something A; A.foo = 12;
   });
}

int main(void) {
    test_trait<int> ();
}

在這里,我只是嘗試在封閉范圍內創建一個本地類型,並在lambda函數中使用它。 這不僅不能編譯(使用Visual Studio 2010,Beta 2),但實際上它會使C1001內部錯誤導致編譯器崩潰。

我已經提交了兩份錯誤報告。

我們會看到它是怎么回事。 :)


更新

這兩個錯誤都被標記為已修復:

感謝您的反饋。 我們之前已經看過這個錯誤,我們已經在下一個版本中修復了它。 感謝您使用該產品。

謝謝,
Ulzii Luvsanbat
Windows C ++團隊

我們去了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM