无效指针,孤立的标识符和更

时间:2018-04-12 15:02:39

标签: c++ pointers void

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

我正在搜索一些东西进行任务,我找到了我要找的东西,但在我查看的结果中,我发现了这个问题,我看到了很多我不了解/理解的东西: 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 {output_file};
  • [&安培; refvar]
  • (const void * dvar)
  • - >空隙
  • 无效**
  • unsigned int *

关于虚空的;我的印象是应该避免使用无效指针(哦,嘿,双关语:P),因为我读到的内容就像对此的回复:List of pointers to different types of objects " 只使用空格作为最后且非常非常危险的解决方案。"

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

编辑:

尝试缩小问题范围:如何访问类型" void"工作,[& refvar]做什么?

2 个答案:

答案 0 :(得分:0)

fstream& refvar{ output_file };

声明类型&#34的局部变量;引用fstream"并通过引用output_file成员来初始化它。

[&refvar]

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

(const void* dvar)

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

-> void

lambda返回类型(void)。请注意,此"尾随返回类型"版本也适用于普通功能,但在那里很少使用。

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

关于"你如何处理空指针":Dereferencing the void pointer in C++

答案 1 :(得分:0)

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

  1. fstream的&安培; refvar {output_file};
  2. [&安培; refvar]
  3. (const void * dvar)
  4. - >空隙
  5. 无效**
  6. unsigned int *
  7. <强>数目:

    1. 这实际上返回了成员变量&#34; output_file&#34;奇怪的是(注意:如果有疑问,请在小班上试试。)
    2. 这是&#34; lambda函数&#34;的一部分,就像javascript中的回调函数。 [&amp; refvar]需要&#34; refvar&#34;从lambda函数的外部引用并在lambda函数内部使用它,解决了范围问题。
    3. void指针可以指向任何类型的对象(例如Java的 Object -type),但是如果你想要它被解除引用,它就不能这样做,除非首先将其输入到所需类型,然后 取消引用它。我仍然不知道为什么它被称为危险。你可能需要这种百万分之一的情况。
    4. - &GT; void是lambda函数的返回类型, - &gt;就是它的编写方式,与访问会员无关。
    5. void **显然是一个虚空ptr-to-ptr,可以使用与* *相同的方式使用,不知道你是否必须输入两次(每次解除引用一次) ,但试一试,看看。)
    6. 我不完全确定为什么数组大小 指针 是无符号的,但如果数组需要更大的数量(数量只能是正数或0,所以有理由得到一个尽可能大的正限制然后它就可以得到它,也许一个带符号的指针不能指向一个无符号指针。