小编Nem*_*olh的帖子

为什么void*不是迭代器类型?

我用GCC 4.8测试了下面的代码,但是没有编译,因为我们无法形成对void的引用.

#include <iterator>
int main()
{
    std::iterator_traits<void*> test;
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着void*不是迭代器?(这里的概念意思)

编辑:

好的问题是形成不良.我实际上问的是为什么C++需要void*的这种行为?是出于安全考虑,即阻止人们写坏事吗?

因为虽然引用void是非法的,但指针算术是:

int main()
{
    std::uint8_t test[] = {1,2,3};
    void * wut = test;
    std::uint8_t * p2 = static_cast<std::uint8_t *>(wut + 1);
    std::cout << std::hex << static_cast<int>(*p2) << std::endl; 
}
Run Code Online (Sandbox Code Playgroud)

因此,正如你所说的那样,从GCC的角度来看,空虚的规模并不大.它是计算机中最小的可加压单元的大小.

c++ gcc iterator

17
推荐指数
3
解决办法
1528
查看次数

如何只强制类的智能指针实例?

我一直在努力防止用户使用没有智能指针的类.因此,强制它们使对象被智能指针分配和管理.为了得到这样的结果,我尝试了以下方法:

#include <memory>
class A
{
private :
    ~A {}
    // To force use of A only with std::unique_ptr
    friend std::default_delete<A>;
};
Run Code Online (Sandbox Code Playgroud)

如果您只希望您的类用户能够通过操作类的实例,那么这项工作非常好std::unique_ptr.但它不起作用std::shared_ptr.所以我想知道你是否有任何想法来获得这样的行为.我发现的唯一解决方案是执行以下操作(使用friend std::allocator_traits<A>;效率不高):

#include <memory>
class A
{
private :
    ~A {}
    // For std::shared_ptr use with g++
    friend __gnu_cxx::new_allocator<A>;
};
Run Code Online (Sandbox Code Playgroud)

但这种解决方案不可移植.也许我做错了.

c++ class-design smart-pointers c++11

12
推荐指数
1
解决办法
2578
查看次数

标签 统计

c++ ×2

c++11 ×1

class-design ×1

gcc ×1

iterator ×1

smart-pointers ×1