C++ Visual Studio 2015:是否允许使用一组常量指针?

C++ Visual Studio 2015:是否允许使用一组常量指针?,c++,pointers,c++11,visual-studio-2015,containers,C++,Pointers,C++11,Visual Studio 2015,Containers,我们将很快升级到VS2015,我在突破性更改列表中发现: 常量元素 C++标准始终禁止const元素容器 (如向量或集合)。Visual C++ 2013及其更早 接受这种容器。在当前版本中,此类容器失败 编译 我想知道是否有人知道这是否也适用于集合。 我知道映射仍然可以包含常量指针作为键,因为它们无论如何都是常量 例如: std::set<const QObject*> std::set 我还能这样做吗?根据微软网站上的帖子,我不这么认为。constqobject*是指向一

我们将很快升级到VS2015,我在突破性更改列表中发现:

常量元素

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

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

例如:

std::set<const QObject*>
std::set

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

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

由于Microsoft文章讨论了
const
对象,而
constqobject*
而不是,因此您的示例很好

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

std::set
始终无效,并且
std::map s始终有效。原因是
std::set
的分配器是
std::分配器
,而
std::map
的分配器是
std::分配器
。根据定义,
std::allocator
格式不正确。如果希望
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}};
inti=42;
int*const j=&i;
std::map s{{j,j};

const T*
T*const
不是一回事。引文字面上说它适用于set。然而,您的代码与引号没有太多关系,因此您很安全:)这种混淆被一种高贵但误导性的样式所强化,这种样式省略了星号(或参考号上的符号)前的空格。可视化地编写
const QObject*
表明
*
绑定到QObject的程度比
const
更紧。移动
常量
没有帮助:
QObject常量*
。就像写
返回a*x+b*y