std :: vector的概念和GCC实现

时间:2013-11-01 11:16:45

标签: c++ pointers c++11 stdvector c++-concepts

让我们尝试创建一个类似指针的类型匹配 RandomAccessIteratorNullablePointer概念。 这里的目标是创建自定义Allocator 为了使用std :: vector和我们类似指针的类型。您可以找到代码段here

尝试编译此代码时出现问题:

int main()
{
     std::vector<float, allocator<float>> t {0.f, 0.f};
}

我们收到以下错误消息:

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:173:6: error: 
  value of type 'pointer' (aka 'ptr_like<int>') is not contextually convertible
  to 'bool'
    if (__p)

在这里,我们看到我们的类型必须是bool convertible。这不难做到, 如果人们有我们的指针类型的实例,他们可能会像这样使用它。 因此,让我们这样做,并将以下内容取消注释到我们的代码段:

// In detail::ptr_like we add :
operator bool() const;

我们在clang中遇到以下错误:

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/stl_vector.h:168:25: error: 
  conditional expression is ambiguous; 'pointer' (aka 'ptr_like<int>') can be
  converted to 'int' and vice versa
  { return __n != 0 ? _M_impl.allocate(__n) : 0; }

Clang的错误告诉我们为什么我们在这里遇到麻烦。 现在我发现的唯一可行解决方案如下:

  • 请求c ++ 11时,使用c ++ 11关键字0替换nullptr
  • 通过强制转换将0替换为指针类型static_cast<pointer>(0)
  • 在分配器概念中更新指针的概念要求。
  • 不使用std::initializer_list(悲伤)
  • 的构造函数

在C ++中定义自定义指针是错误的吗?

这是一个错误吗?

2 个答案:

答案 0 :(得分:4)

扩展我的评论。

{ return __n != 0 ? _M_impl.allocate(__n) : 0; }

第一个结果可以转换为boolint。第二个结果可以转换为int。这与将第二个结果转换为pointer的结果一样好,因此它不明确。

但我们不希望bool转换在此处可用,因此我们可以将其设为explicit。它仍然可以在逻辑条件等中使用,正如我所描述的here。 上下文可转换为bool是另一个条件标准放置在满足NullablePointer要求的自定义指针类型上(自2011年起 - 见17.6.3.3/3)。

答案 1 :(得分:2)

我建议将转换运算符定义为显式。例如

explicit operator bool() const;