gpt4 book ai didi

c++ - 同样的 clang ,std::initializer_list 程序与 -std=c++14/-std=c++17 的结果不同

转载 作者:行者123 更新时间:2023-12-04 11:46:36 25 4
gpt4 key购买 nike

首先,这是一个好奇的问题,我永远不会在现实生活中编写这样的代码。

以下代码与 -O3 -std=c++14 和 -O3 -std=c++17 标志的行为不同,在 C++14 中,我得到了错误的分配,我推测是从垃圾 std::string 的复制构造:

#include<algorithm>
#include<numeric>
#include<vector>
#include<string>
#include<iostream>

using namespace std;
static auto results = std::initializer_list<string>{"1 ",
"2"};
string f() {

auto result = std::accumulate(results.begin(), results.end(), string(""));
return result;

}

int main()
{
return f().size();
}

https://godbolt.org/z/H-Xzei

我的猜测是 C++17 版本比 C++14 版本保持底层数组的存活时间更长,但我发现 cppreference 上的初始化列表从 C++14 到 C++17 没有相关更改,所以我很困惑。
这只是 UB 是 UB,还是语言发生了变化?

附言我知道如何解决这个问题,使用 static const auto& results作品,就像之前提到的,这只是一个关于语言极端情况的问题。

最佳答案

这与保证复制省略有关,这是 C++17 中的新语言特性。

这一行(减少):

static auto results = std::initializer_list<string>{x, y};

在 C++14 中构造一个初始化列表,然后将其移入 results - 立即悬挂,因为 initializer_list不管理任何生命周期( std::initializer_list 有一个与初始对象具有相同生命周期的后备常量数组 - 一旦初始 initializer_list 在行尾被销毁,后备数组也是如此)。

换句话说,在 C++14 中,这个程序有未定义的行为。

在 C++17 中,它的行为完全类似于:
static std::initalizer_list<string> results{x, y};

在这种情况下,后备数组的生命周期与 results 相同。 ,这是程序的长度。该程序具有明确定义的行为。

关于c++ - 同样的 clang ,std::initializer_list 程序与 -std=c++14/-std=c++17 的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59380200/

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