我用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的角度来看,空虚的规模并不大.它是计算机中最小的可加压单元的大小.
我一直在努力防止用户使用没有智能指针的类.因此,强制它们使对象被智能指针分配和管理.为了得到这样的结果,我尝试了以下方法:
#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)
但这种解决方案不可移植.也许我做错了.