C++ 有没有办法保存自动变量并在以后使用?

C++ 有没有办法保存自动变量并在以后使用?,c++,c++11,auto,C++,C++11,Auto,我正在尝试保存一个代码块并在以后使用它。因此,我将能够将自动变量声明为全局变量,分配它,然后调用该块: // In the header auto __myblock; // error 然后: __myblock=[]() { <code> }; <other code> __myblock(); \uuu myblock=[]() { }; __myblock(); 但问题是我得到了一个语法错误:似乎我必须在声明变量时初始化它,因此,我无法记住该块并在

我正在尝试保存一个代码块并在以后使用它。因此,我将能够将自动变量声明为全局变量,分配它,然后调用该块:

// In the header
auto __myblock; // error
然后:

__myblock=[]()
{
    <code>
};
<other code>
__myblock();
\uuu myblock=[]()
{

};
__myblock();

但问题是我得到了一个语法错误:似乎我必须在声明变量时初始化它,因此,我无法记住该块并在以后使用它。我需要将该块作为全局变量或在类中记住。在类中,我也不允许将auto声明为实例变量。有办法吗?

在您的问题中有两个问题:

  • 我是否可以提前声明自动变量(在初始化之前)
  • 如何存储lambda函数
  • 第一个问题的答案是“否”:自动变量的声明必须与初始化一起提供。你不能有:

    auto x;  // error
    x = 42;
    
    因为编译器在声明时不知道x应该是什么。另一方面:

    auto x = 42;
    
    是有效的,因为42是int,所以编译器为x分配一个整数

    对于第二个问题,使用std::function。它尽可能地优化。有一些细节需要考虑。具体来说:是代码块
    指lambda函数范围之外的变量。如果是,您希望它通过值还是通过引用引用这些变量。所有这些变量都必须存储在某个地方(也称为capture),这就是std::function所做的。若并没有任何捕获,那个么std::function基本上就是一个指向函数的简单指针,它已经尽可能地优化了。在页眉处有:

    // with no capture:
    std::function<void()> _myblock;
    
    // if you have capture (say, two integers)
    std::function<void(int,int)> _myblock
    

    最后,正如一位评论者所指出的,如果您没有捕获,最好的方法是简单地将
    代码分解成一个函数,然后简单地调用它。

    不要在名称中使用双下划线。任何与这些相关的内容都将保留给实现。不管怎样,它总是一个具有相同函数签名的lambda吗?如果是这样,只需将其声明为正确的
    std::function
    类型。
    auto
    变量必须在创建时初始化。你不能像以前那样使用它。@chris:这是个好主意,它可能会满足OP的需要。但需要注意的是,这不是同一回事,
    std::function
    的性能特性比裸lambda更差。@BenjaminLindley,没错,我通常从不担心性能,除非有充分的理由提到它。根据代码的不同,这可能根本没有什么区别。如果lambda没有捕获,为什么不使用常规函数呢?捕获代码在这里有点奇怪
    [x,y]{
    }
    不需要将整数作为参数,它可以在没有参数的情况下访问它们。@Xeo,你是对的。在lambda中不需要形式参数(事实上,没有参数的形式就是规范形式)。我添加了它的可读性,但肯定可以删除。
    // no capture:
    _myblock = []() { <code> }
    
    // with capture:
    _myblock = [x,y]( int x, int y) { <code> }