我尝试编译以下代码:
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
默认情况下在 C++ 中。 Shadi 提供了一个非常好的链接他的回答 https://stackoverflow.com/a/49644935/8853275.
第二件事是大括号初始化不能接受缩小转换。 Meyers 的第 7 条对此进行了很好的解释有效的现代 C++ http://shop.oreilly.com/product/0636920033707.do一本书,非常值得推荐的一本书。
这是类型系统的问题:当您使用大括号内的值初始化容器时,例如{ "a","an","the" };
,这个大括号表达式被推导为具有类型std::initializer_lists<const char *>
,然后它将调用容器的构造函数,该构造函数将初始值设定项列表作为参数。但是,请记住字符串文字具有类型const char *
在 C++ 中,但是您声明了向量来保存类型的元素char *
。这将意味着缩小转换范围const char * -> char *
,大括号初始化不允许。因此,这个构造函数被丢弃,没有找到其他构造函数,并且您的编译器会抱怨。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)