【问题标题】:error C2440: 'initializing': cannot convert from 'initializer list' to 'std::vector<char *,std::allocator<_Ty>>'错误 C2440:“正在初始化”:无法从“初始化列表”转换为“std::vector<char *,std::allocator<_Ty>>”
【发布时间】:2018-04-04 06:09:32
【问题描述】:

我尝试编译以下代码:

vector<char*> art = { "a","an","the" };

但收到错误消息:

error C2440: 'initializing': cannot convert from 'initializer list' to 'std::vector<char *,std::allocator<_Ty>>'
1>        with
1>        [
1>            _Ty=char *
1>        ]
1> note: No constructor could take the source type, or constructor overload resolution was ambiguous

如果我像这样将元素类型更改为“const char *”:

vector<const char*> art = { "a","an","the" };

可以编译。谁能告诉我原因吗?非常感谢。

【问题讨论】:

  • 字符串文字是const char*,而不是char*。有足够的理由吗?
  • 的另一个变体“为什么我不能用字符串文字初始化char*?”。令人印象深刻。
  • 字符串文字是只读的,语言有某种静态断言你没有试图改变一个的方式是有意义的。

标签: c++


【解决方案1】:

这里发生了两件事。第一个也是最基本的一个,是 C++ 中默认的字符串文字是 const。 Shadi 在his answer 中提供了一个非常好的链接。

第二件事是大括号初始化不能接受缩小转换。这在 Meyers 的 Effective Modern C++ 书中的第 7 项中得到了很好的解释,非常值得推荐。

这是类型系统的问题:当您使用大括号内的值初始化容器时,例如在 { "a","an","the" }; 中,这个大括号表达式被推断为具有类型 std::initializer_lists&lt;const char *&gt;,然后它将调用容器的构造函数,该构造函数接受初始化列表作为参数。但是,请记住,字符串文字在 C++ 中具有 const char * 类型,但是您声明了向量以保存 char * 类型的元素。这将意味着缩小转换const char * -&gt; char *,大括号初始化不允许。因此,这个构造函数被丢弃,没有找到其他构造函数,并且您的编译器会报错。

【讨论】:

    【解决方案2】:

    原因是因为字符串字面量是常量,它们被存储在只读内存中。 Why?

    如果适合你,你也可以使用:

    vector<string> art = { "a","an","the" };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      相关资源
      最近更新 更多