【问题标题】:Scope in a lambda expressionlambda 表达式中的作用域
【发布时间】:2011-01-17 20:22:19
【问题描述】:
#include "stdafx.h"
#include <iostream>
using namespace std;

template<class Type>
struct X
{
    void run()const
    {//Why on earth this doesn't work?
        [&]()
        {
            Type::alloc();
        };
    }
    void run_1()const
    {//if this does
        Type::alloc();
    }
};

struct T
{

    static void alloc()
    {}
};


int _tmain(int argc, _TCHAR* argv[])
{
    X<T> x;
    x.run_1();
    return 0;
}

AFAIC lambda 是一个未命名的 fnc,所以如果这是真的,为什么 run 不能编译而 run_1 可以呢?
使用VS2010 sp beta1。

【问题讨论】:

标签: c++ lambda c++11


【解决方案1】:

您必须将其传递给 lambda:

    void run()const
    {//Why on earth this doesn't work?
        auto alloc = Type::alloc;
        [&]()
        {
            alloc();
        };
    }

【讨论】:

  • @Moo-Juice 所以“他们”所说的关于 lambdas 的说法不是真的,lambdas 与 fnc 相同,唯一的例外是没有名字?我真的很喜欢这个 fnc 正文中的第一行。谢谢。至于lambdas?失望。您只能在最简单的情况下使用它们,但需要更高级使用的人必须使用“命名”fncs。失望。谢谢你的回答。
  • @Moo-Juice 在我的“真实示例”中它并没有真正起作用。原因?来自 Type 的 alloc 被重载。
  • @那里,您可以将其中的一些(或示例代码)粘贴到问题的末尾以给我一个想法吗?
  • @Moo-Juice 太多行和两个很多标题。实现是一个单独的标头,Alloc 是来自不同标头的 typedef,而 memoryManager 再次位于不同的标头中。但是你可以尝试一下,如果你真的想检查它会使 alloc 重载,你应该得到与我“相同”的结果。
  • @那里,我假设你得到的错误是error C3535: cannot deduce type for 'auto' from 'overloaded-function' ?
【解决方案2】:

我不得不承认我不太确定,但我认为这只是 VS 2010 的限制,它应该在 C++0x 中编译得很好(参见templates, typename, lambda -> dependent names not dependent?)。我认为您所看到的机制如下:

在定义模板时,模板参数定义的类型在某些方面不是“完全成熟的”类型名。一个证明这一点的例子是,虽然有人可能期望 X&lt;Foo&gt;::Type(在你的例子中带有 X)返回 Foo,但它没有。

【讨论】:

    【解决方案3】:

    你必须调用 lambda。它是一个仿函数,因此您需要在其末尾添加一个 () 才能有效地调用 lambda。

    /* Code does NOT answer question above...
    void run()const
        {//Why on earth this doesn't work?
            [&]()
            {
                Type::alloc();
            }(); //very important parenthesis if you wish to call the lambda
        }*/
    

    我似乎误读了这个问题。对不起。


    但是在SO Template type is not "seen" by the compiler inside a lambda上已经有类似的帖子了

    这里是另一个链接,它引用了相同的问题,并引用了标准中的相关内容。 templates, typename, lambda -> dependent names not dependent?

    【讨论】:

    • @RedX 你在发帖前检查过你的答案吗?
    • 你用的是什么编译器?是否支持 C++0x?
    • 这不能解释为什么它不能编译。
    • 只有 c++0x 有 lambda 支持...否则编译器将无法理解语法?
    • @这里有一个类似的问题,也许它可能会帮助stackoverflow.com/questions/4326674/…
    猜你喜欢
    • 2011-09-03
    • 2019-01-16
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 2011-11-23
    相关资源
    最近更新 更多