c++ - lambda 可以安全地返回复制变量的地址吗?

标签 c++ c++11 lambda

给出以下示例代码:

int main()
{
    int i;
    auto f = [=]()mutable->int*
    {
            return &i;
    };

    return 0;
}
  1. g++ v.4.8.1 警告“返回局部变量‘i’的地址”。
  2. Clang v.3.2(MacOS 的 Clang)警告说“堆栈内存的地址 与返回的局部变量“i”相关联”。
  3. VS2012 和 VS2013 RC 均未发出任何警告。

我对 lambdas 的理解是编译器会生成一个仿函数类。该仿函数类将具有所有复制变量的成员(示例中为 i)。我相信在我的代码上下文中,只要 f 存在,返回其成员之一的地址是安全的。在我看来,所有编译器都弄错了。我认为在 f 超出范围后使用 f 的成员 i 的地址的警告是有效的,但有关“局部变量 'i'"不正确/具有误导性。我说的对吗?

最佳答案

是的,你是对的。 & 运算符应用于成员,而不是本地对象。

演示很简单:只需修改您的示例以输出地址。

#include <iostream>

int main() {
    int i;
    std::cout << & i << '\n';

    std::cout << [=]() mutable -> int * {
        return & i;
    } () << '\n';
}

http://ideone.com/OqsDyg

顺便说一句,在 GCC 4.9 中的 -Wall 下编译时没有警告。

关于c++ - lambda 可以安全地返回复制变量的地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18949577/

相关文章:

c++ - 数组和右值(作为参数)

c++ - 如何制作递归编译时可变结构模板

c++ - GNUMakefile 和 gcc : resolving the order of conflicting "-std=c++" requirements

java - 使用 Java 8 Lambda 表达式合并映射流

C++ 从外部设备读取数据 - 连接 : OPTO-USB

c++ - 局部变量的堆栈溢出?

c++ - 使用以类 vector 作为参数的函数清除派生类 vector

c++ - 返回由另一个本地对象定义的对象

java - List<Object[]> 到 Java 8 中的 Map<K, V>

c# - 将 C# lambda 函数转换为 VB.net