【问题标题】:Compiler error reported for const vector<const T> in VS 2015 but not VS 2013在 VS 2015 中为 const vector<const T> 报告编译器错误,但在 VS 2013 中未报告
【发布时间】: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&gt;xmemory0(587): error C2338: The C++ Standard forbids containers of const elements because allocator&lt;const T&gt; is ill-formed.

我看过各种各样的帖子,尤其是这个Does C++11 allow vector<const T>?,关于vector&lt;const T&gt; 以及为什么不允许但我真的不明白。但是,在上面的示例中,向量本身是 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


【解决方案1】:
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 编译成功是错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2011-01-17
    • 2016-05-29
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多