调用指向超出范围的 lambda 的指针是否合法?

Joh*_*ohn 6 c++ lambda c++11

调用指向不再存在的 lambda 的指针是否合法?

这是演示代码片段

#include <iostream>

typedef int (*Func)(int a);

int main()
{
 Func fun;

 {
    auto lambda = [](int a)->int{std::cout << a << std::endl; return a;};   
    fun =lambda;
 }

 fun(6); //Is it legal? The variable lambda does not exist anymore.
}
Run Code Online (Sandbox Code Playgroud)

通用条件怎么样,比如说有捕获的 lambda?

小智 1

这段代码是合法的。正如您所看到的,如果您使用网站https://cppinsights.io/ ,上面的代码实际上会翻译成这样:

#include <iostream>

typedef int (*Func)(int a);

int main()
{
  using FuncPtr_7 = Func;
  FuncPtr_7 fun;
  {
        
    class __lambda_10_19
    {
      public: 
      inline /*constexpr */ int operator()(int a) const
      {
        std::cout.operator<<(a).operator<<(std::endl);
        return a;
      }
      
      using retType_10_19 = auto (*)(int) -> int;
      inline constexpr operator retType_10_19 () const noexcept
      {
        return __invoke;
      }
      
      private: 
      static inline /*constexpr */ int __invoke(int a)
      {
        return __lambda_10_19{}.operator()(a);
      }
      
      
    };
    
    __lambda_10_19 lambda = __lambda_10_19{};
    fun = static_cast<int (*)(int)>(lambda.operator __lambda_10_19::retType_10_19());
  };
  fun(6);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

sofun指向一个静态函数 ( __invoke),该函数不会超出范围。