【发布时间】:2015-12-28 04:10:42
【问题描述】:
以下代码使用 Visual Studio 2013 编译成功。
#include <vector>
#include <string>
int main()
{
const std::string constString("fred");
const std::vector<const std::string> myVector{ constString };
}
如果我尝试使用 Visual Studio 2015 编译它,则会报告以下错误:
1>xmemory0(587): error C2338: The C++ Standard forbids containers of const elements because allocator<const T> is ill-formed.
我看过各种各样的帖子,尤其是这个Does C++11 allow vector<const T>?,关于vector<const T> 以及为什么不允许但我真的不明白。但是,在上面的示例中,向量本身是 const。
谁能解释一下? VS 2013编译成功是不是错了?
【问题讨论】:
-
如果您不相信您链接的答案,尤其是 cmets,需要什么来说服您? Howard Hinnant 是 C++11 委员会的成员。
-
没有帮助的评论。它没有说我不相信给出的答案,我确实说我真的不明白。此外,myVector 是 const,不讨论,VS2013 编译代码。
-
vector 是 const 并不重要——它仍然需要在其构造函数中为你想要放入其中的唯一元素分配内存——而且,正如错误消息所暗示的那样,问题正是与分配器。显然是VS2013缺少的VS2015中添加的诊断,所以是的,VS2013编译成功是错误的。
-
当向量超出容量时,它会分配一个新数组并将所有元素复制到新数组中。这要求元素为copy assignable。 const 类型根据定义是不可复制可分配的(根本不可分配)。
-
@rustyx:听说过复制构造函数吗?
标签: c++11 visual-studio-2013 vector constants visual-studio-2015