【问题标题】:Visual Studio 2015: is a set of const pointers allowed?Visual Studio 2015:是否允许使用一组 const 指针?
【发布时间】:2016-05-09 08:36:05
【问题描述】:

我们将很快升级到 VS2015,我在重大更改列表中找到了这个:

常量元素

C++ 标准一直禁止 const 元素的容器 (如向量或集合)。 Visual C++ 2013 及更早版本 接受这样的容器。在当前版本中,此类容器失败 编译。

source

我想知道是否有人知道这是否也适用于集合。 我知道映射仍然可以包含 const 指针作为键,因为它们无论如何都是 const。

一个例子:

std::set<const QObject*>

我还能这样做吗?根据微软网站上的帖子,我认为不会。

【问题讨论】:

  • const T*T* const 不是一回事。
  • 这句话的字面意思是它适用于集合。但是,您的代码与报价没有太大关系,因此您很安全:)
  • 这种混淆被省略了星号(或引用上的&符号)之前的空格的高贵但具有误导性的风格所强化。写const QObject* 视觉上表明*const 更紧密地绑定到QObject。移动const 没有帮助:QObject const*。这就像写return a * x+b * y;

标签: c++ pointers c++11 visual-studio-2015 containers


【解决方案1】:

const QObject* 是一个指向 const QObject 的指针。指针本身仍然是可修改的。 const QObject* const 将使指针本身成为const

由于 Microsoft 文章谈到 const 对象,而 const QObject* 不是,因此您的示例很好。

【讨论】:

    【解决方案2】:

    我知道映射仍然可以包含 const 指针作为键,因为它们无论如何都是 const。

    std::set&lt;T* const&gt; 一直无效,std::map&lt;int* const, int* const&gt; s; 一直有效。原因是std::set 的分配器是std::allocator&lt;Key&gt;,而std::map 的分配器是std::allocator&lt;std::pair&lt;const Key, T&gt;&gt;。根据定义,std::allocator&lt;const T&gt; 格式错误。如果你想让map 代码失败,你必须像这样指定一个自定义分配器:

    int i = 42;
    int* const j = &i;
    std::map<int* const, int* const,
        std::allocator<const std::pair<int* const, int* const>>> s{{j, j}};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多