首页 文章

无效指针,隔离标识符等

提问于
浏览
-3

我不知道如何准确地对这个问题进行分类,所以我只想解释一下:

我正在谷歌搜索一些东西进行任务,我找到了我要找的东西,但在我检查的结果中,我发现了这个问题,我看到了很多我不知道的事情/了解:C++ Lambda capture private class member

//...
    bool dump_dvars()
    {
        fstream& refvar{ output_file };

        for_each(_array_start, _array_start + *_array_size,
            [&refvar](const void* dvar) -> void
        {
            //work with output_file
        });

        return true;
    }

private:
    void** _array_start;
    unsigned int* _array_size;
    fstream output_file;
};

我不知道每种组合的具体名称是什么,但我想知道它们的作用:

  • fstream&refvar ;

  • [&refvar]

  • (const void * dvar)

    • 无效

  • void **

  • unsigned int *

涉及无效的;我的印象是应该避免使用无效指针(哦,嘿,双关语:P),因为我读到了这样的回复:List of pointers to different types of objects“只使用虚空作为最后一个非常非常危险的解决方案 . ”

那么有一个类型为void的指针和一个void类型的指针指针,并使用lambda访问类型“void”的用法是什么?这甚至做了什么?它不是从中获取存储数据的变量,它访问了什么?当“output_file”没有分配类型也没有存储时会做什么(所以我猜它不会返回任何内容,并且它不会被返回,所以它看起来不像是一个函数),它没有'有括号所以它不需要参数 - 它只是一个站在那里的标识符,它做了什么?如果你的int指针是无符号的,那有什么关系呢?不是所有的int都像基类一样(我知道int不是一个类)所以你可以指向任何类型的int的另一个整数?所有有符号和无符号整数在指向应该存储在存储器中的位置时具有相同的大小,即什么地址,这只是它将/可以在那里保持什么“方向”或值的问题 .

编辑:

尝试缩小问题:如何访问“void”类型,以及[&refvar]做什么?

2 回答

  • 0

    虽然Max Langhof的回答令人满意,但我想向自己解释这个问题以供将来使用(也许其他人可能会发现这个解释更直接或更有用):

    • fstream&refvar ;

    • [&refvar]

    • (const void * dvar)

      • 无效

    • void **

    • unsigned int *

    Answers:

    • 这实际上足够奇怪地返回成员变量"output_file"(注意:如果有疑问,请在小类中尝试这个) .

    • 这是"lambda function"的一部分,它就像是javascript中的回调函数 . [&refvar]从lambda函数的外部获取"refvar",并提供对lambda函数内部使用的引用,解决了范围问题 .

    • void指针可以指向任何类型的对象(如Java的Object-type),但是如果你想要它被解除引用,它就不能这样做,除非你先将它输入到所需的类型,然后取消引用它 . 我仍然不知道为什么它被称为危险 . 可能是你需要的百万分之一的情况 .

      • void是lambda函数的返回类型, - >就是它的编写方式,与访问成员无关 .

    • void **显然是一个void ptr-to-ptr,可以使用相同的方式使用void *,不知道你是否必须对它进行两次类型转换(每次取消引用一次,但试试看出去看看) .

    • 我不完全确定为什么数组大小 pointer 是无符号的,但是如果数组想要更大的数量(数量只能是正数或0,那么有一个可以获得的正限制是有意义的)那么它可以得到它,也许一个带符号的指针不能指向无符号指针 .

  • 0
    fstream& refvar{ output_file };
    

    声明"reference to an fstream"类型的局部变量,并使用对 output_file 成员的引用对其进行初始化 .

    [&refvar]
    

    捕获 refvar 为lambda . 换句话说,lambda存储对refvar的引用,该引用可以在lambda体内访问 .

    (const void* dvar)
    

    lambda参数列表 . 可以使用const void指针(名为 dvar )调用此lambda .

    -> void
    

    lambda返回类型(void) . 请注意,这种“尾随返回类型”版本也可用于普通函数,但很少在那里使用 .

    最后一个是明显的指针类型 .

    至于"what do you do with the void pointer":Dereferencing the void pointer in C++

相关问题