C++11 常量向量报告的编译器错误<;常数T>;与2015年相比,而不是与2013年相比

C++11 常量向量报告的编译器错误<;常数T>;与2015年相比,而不是与2013年相比,c++11,visual-studio-2013,vector,constants,visual-studio-2015,C++11,Visual Studio 2013,Vector,Constants,Visual Studio 2015,以下代码使用Visual Studio 2013编译OK #include <vector> #include <string> int main() { const std::string constString("fred"); const std::vector<const std::string> myVector{ constString }; } #包括 #包括 int main() { const std::string co

以下代码使用Visual Studio 2013编译OK

#include <vector>
#include <string>

int main()
{
    const std::string constString("fred");
    const std::vector<const std::string> myVector{ constString };
}
#包括
#包括
int main()
{
const std::string constString(“fred”);
const std::vector myVector{constString};
}
如果我尝试使用Visual Studio 2015编译它,将报告以下错误:

<代码> 1 > XMeMeLy0(587):错误C23 38:C++标准禁止分配器容器,因为分配器不正确。 我看过各种各样的帖子,尤其是这篇,关于

vector
,以及为什么它不被允许,但我真的不明白。然而,在上面的示例中,向量本身是常量

有人能解释一下吗?VS 2013成功编译它是错误的吗

Standard   Requirement for T
========   =================
C++03      any type
C++11      any non-const, non-reference object type
C++14      any non-const object type
C++17      any cv-unqualified object type
标准中没有任何地方对
当容器本身是
const


是的,VS 2013的成功编译是错误的。

如果你不相信你链接的答案,尤其是评论,你需要什么来说服你?Howard Hinnant是C++11委员会的成员。这不是一个有用的评论。它没有说我不相信给出的答案,我也说过我真的不明白。此外,myVector是const,这一点没有讨论,VS2013编译代码。该向量是否为const并不重要——它仍然需要在其构造函数中为要放入其中的唯一元素分配内存——正如错误消息所示,问题恰恰出在分配器上。显然,这是VS2015中添加的一个VS2013所缺少的诊断,因此,是的,VS2013成功编译它是错误的。当向量超出容量时,它会分配一个新数组并将所有元素复制到新数组。这需要对元素进行修改。const类型根据定义是不可复制分配的(根本不可分配)。@rustyx:听说过复制构造函数吗?