none
Lamda表达式this与&用法: RRS feed

  • 问题

  • 现在在Win8中经常看到Lambda表达式:

    例如:

                    outputText = "The FAL list contains the following item(s):\n\n";
                    std::for_each(begin(entries), end(entries), [this, &outputText](const AccessListEntry& entry)
                    {
                        outputText += entry.Metadata + "\n"; // Application previously chose to store sampleFile->Name in this field
                    });
    
    
    
                            create_task(FileIO::ReadTextAsync(file)).then([this, file](String^ fileContent)
                            {
                                OutputTextBlock->Text = "The file '" + file->Name + "' was opened by a stored token from the MRU list, it contains the following text:\n\n" + fileContent;
                            });

    问题1:请问为什么都需要this关键字呢?

    问题2:有时使用&符号,有时却不使用:是否这个是否是需要传递引用时候使用&符号,当对象本身已经是引用类型就不需要了呢?可是代码中的outputtext是字符串引用类型为什么还是需要&符号呢,file却不使用&符号?请求解惑


    2013年5月27日 8:41

答案

  • 我偷下懒, MSDN的解释 http://msdn.microsoft.com/zh-cn/library/dd293603.aspx

    捕获子句

    Lambda 表达式可以访问具有自动存储持续时间和封闭范围中的可访问的任何变量。 捕获子句指定是否将 lambda 表达式的主体通过值或引用访问封闭范围中的变量: 具有 & 符的变量 (&) 前缀的引用,并不具有的变量访问&前缀值的访问。 空捕获子句中, [],指示正文的 lambda 表达式访问封闭范围中的任何变量。
    默认捕获模式指定显式指定的捕获变量捕获到通过值或引用。 您可以指定默认的捕获模式 (capture-default在语法) 通过指定&或=捕获子句的第一个元素。 & 元素指定除非显式指定,否则将 lambda 表达式的主体的访问通过引用所有捕获的变量。 = 元素指定除非显式指定,否则将 lambda 表达式的主体访问值的所有被捕获的变量。 例如,如果 lambda 表达式的主体访问外部变量total的引用和外部变量factor的数值,然后捕获以下子句是等效的:

    [&total, factor]
    [&, factor]
    [=, &total]
    
     

    您可以使用类方法的主体中的 lambda 表达式。 通过this捕获子句可访问到封闭类的方法和数据成员的指针。 有关如何对类方法中使用 lambda 表达式的示例,请参阅示例: 在该主题中的某个方法中使用 Lambda 表达式Lambda表达式的示例。

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。


    2013年5月27日 9:42
    版主