让我们尝试创建一个类似指针的类型匹配 RandomAccessIterator 和NullablePointer概念。 这里的目标是创建自定义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的错误告诉我们为什么我们在这里遇到麻烦。 现在我发现的唯一可行解决方案如下:
0
替换nullptr
0
替换为指针类型static_cast<pointer>(0)
std::initializer_list
(悲伤)在C ++中定义自定义指针是错误的吗?
这是一个错误吗?
答案 0 :(得分:4)
扩展我的评论。
{ return __n != 0 ? _M_impl.allocate(__n) : 0; }
第一个结果可以转换为bool
到int
。第二个结果可以转换为int
。这与将第二个结果转换为pointer
的结果一样好,因此它不明确。
但我们不希望bool
转换在此处可用,因此我们可以将其设为explicit
。它仍然可以在逻辑条件等中使用,正如我所描述的here。
上下文可转换为bool
是另一个条件标准放置在满足NullablePointer
要求的自定义指针类型上(自2011年起 - 见17.6.3.3/3)。
答案 1 :(得分:2)
我建议将转换运算符定义为显式。例如
explicit operator bool() const;