为什么这个initializer_list在传递字符串时使用不当行为
Why does this initializer_list use misbehave when passing strings?
我尝试过G++版本的C++0x初始值设定项列表实现,但它只输出空行。
#include <initializer_list>
#include <iostream>
#include <string>
int main() {
std::initializer_list<std::string> a({"hello", "stackoverflow"});
for(auto it = a.begin(), ite = a.end(); it != ite; ++it)
std::cout << *it << std::endl;
}
我不知道我做错了什么。有人能帮我吗?
在上面的示例中,您似乎正在创建两个初始值设定项列表。临时CCD_ 1和CCD_。
在gcc上,{}
初始值设定项列表实际上是临时数组,其生存期在完整语句之后结束(除非像下面示例中注释行中那样直接绑定到std::initializer_list
(。
第一个列表的内部数组的生存期在a
的构造函数返回后立即结束,因此a
的数组现在指向无效内存(gcc只复制指针(。您可以检查,在进入循环之前是否调用了std::string
析构函数。
当你进入循环时,你正在读取无效的内存。
根据最新的标准草案(n3242(,§18.9/1,初始化器列表甚至不能像那样复制(它们不提供带参数的构造函数(。
#include <initializer_list>
#include <iostream>
class A
{
public:
A(int)
{ }
~A()
{
std::cout << "dtor" << std::endl;
}
};
int main()
{
std::initializer_list<A> a({A(2), A(3)});
// vs std::initializer_list<A> a{A(2), A(3)};
std::cout << "after a's construction" << std::endl;
}
使用gcc 4.5.0,我得到
dtor
dtor
after a's construction
std::initializer_list<std::string> a({"hello", "stackoverflow"});
如果我声明为:
std::initializer_list<std::string> a{"hello", "stackoverflow"}; //without ()
那么它就起作用了:http://ideone.com/21mvL
但这很奇怪。看起来这是一个编译器错误。
编辑:
这无疑是一个编译器错误,因为如果我写(*it).c_str()
,它会打印字符串!!
std::initializer_list<std::string> a({"hello", "stackoverflow"}); //with ()
for(auto it = a.begin(), ite = a.end(); it != ite; ++it)
std::cout << (*it).c_str() << std::endl;
代码:http://ideone.com/hXr7V
相关文章:
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- 冲刺到空字符字符串时的预期行为
- 字符串的异常行为会追加属性 C++
- 从类返回一个字符串 — 奇怪的行为
- OOP 和字符串指针的奇怪行为
- FBString 的小字符串优化是否依赖于未定义的行为?
- 如何使此函数使用 getline 读取字符串并使用 int 执行相同的行为?
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- SWIG和PHP7:奇怪的字符串矢量行为
- 在软呢帽的管道stock鱼不当行为
- 快速 XML 解析不当行为
- 为什么字符串的行为不同?
- 查看实施不当行为
- 计时器、线程和编译器不当行为
- 奇怪的标准::C++中的字符串流行为
- 奇怪的c++字符串连接行为
- 当提取和插入多次时,奇怪的字符串流行为
- 意外的字符串流行为
- 向量<bool>::运算符[] 不当行为?
- 为什么这个initializer_list在传递字符串时使用不当行为