【问题标题】:Conversion from size_t to wchar_t requires a narrowing conversion从 size_t 到 wchar_t 的转换需要缩小转换
【发布时间】:2016-03-09 23:38:57
【问题描述】:

试图编译下面的sn-p代码

static std::vector<wchar_t> produceStrings(int n) {
   std::size_t vsize = 4 * n;
   auto v = std::vector<wchar_t>{ vsize };
   // ...
}

在 VS2015 中给了我错误:

error C2398: Element '1': conversion from 'size_t' to 'wchar_t'
requires a narrowing conversion

v的定义替换为

std::vector<wchar_t> v(vsize);

但是,有效。用例如 10 替换 vsize 也可以。

为什么?

编辑:我正在为 32 位编译。

【问题讨论】:

  • 使用花括号,考虑的隐式转换更少
  • 必须从哪里转换到哪里?
  • vsizesize_t)必须转换为wchar_t
  • 没错,使用了initializer_list&lt;T&gt;构造函数。大括号的内容是将存储在向量中的元素。
  • 还有一个问题是列表初始化版本试图创建一个向量,其中一个元素的值为vsize(因此需要缩小转换,这是不允许的)和构造函数版本尝试使用vsize 元素创建一个向量,每个元素都初始化为零。决定你打算做什么——它们是不可互换的。

标签: c++ c++11 visual-c++ vector visual-studio-2015


【解决方案1】:

std::vector&lt;wchar_t&gt;{ vsize }; 尝试创建一个仅包含元素 vsize 的向量,该向量执行从 size_twchar_t 的转换。

std::vector&lt;wchar_t&gt;(vsize); 构造一个保留vsize 元素的向量,这非常好。

【讨论】:

  • 不是聚合初始化,因为向量不是聚合。是列表初始化,一般禁止缩窄,包括聚合初始化。
猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2015-09-16
  • 2018-03-15
  • 1970-01-01
相关资源
最近更新 更多