![](/img/trans.png)
[英]Is gcc wrongly evaluating std::declval in this concept definition?
[英]Concept and GCC implementation of std::vector
让我们尝试创建一个与RandomAccessIterator和NullablePointer概念相匹配的类似指针的类型。 这里的目标是创建一个自定义分配器,以便将 std::vector 与我们的指针类型一起使用。 你可以在这里找到片段
尝试编译此代码时出现问题:
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 可转换的。 这并不难做到,如果人们有我们的指针类型的实例,他们很可能会像这样使用它。 因此,让我们这样做并取消对我们的代码段的以下注释:
// 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 的错误向我们展示了我们在这里遇到麻烦的确切原因。 现在,我发现的唯一可行的解决方案如下:
nullptr
替换0
0
替换为指针类型static_cast<pointer>(0)
std::initializer_list
的构造std::initializer_list
(悲伤)在 C++ 中定义自定义指针是错误的吗?
这是一个错误吗?
扩展我的评论。
{ return __n != 0 ? _M_impl.allocate(__n) : 0; }
第一个结果可以转换为bool
到int
。 第二个结果可以转换为int
。 这与将第二个结果转换为pointer
一样好,所以它是不明确的。
但是我们不希望bool
转换在这里可用,所以我们可以让它explicit
。 正如我在此处描述的那样,它仍然可以在逻辑条件等条件下使用。 在上下文中可转换为bool
是标准放置在满足NullablePointer
要求的自定义指针类型上的另一个条件(自 2011 年 - 见 17.6.3.3/3)。
我建议将转换运算符定义为显式。 例如
explicit operator bool() const;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.