[英]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內部錯誤導致編譯器崩潰。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.