gpt4 book ai didi

c++ - 为什么这个 initializer_list 在传递字符串时使用了错误行为?

转载 作者:可可西里 更新时间:2023-11-01 16:41:28 26 4
gpt4 key购买 nike

我已经尝试了我的 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;
}

我不知道我做错了什么。谁能帮帮我吗?

最佳答案

在上面的示例中,您似乎正在创建两个初始化列表。临时{"hello", "stackoverflow"}std::initializer_list<std::string> a .

在 gcc 上,{}初始化列表实际上是临时数组,其生命周期在完整语句后结束(除非直接绑定(bind)到 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

关于c++ - 为什么这个 initializer_list 在传递字符串时使用了错误行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5605375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com