首先,这是一个好奇的问题,我在现实生活中不会编写这样的代码。
使用 -O3 -std=c++14 和 -O3 -std=c++17 标志时,以下代码的行为不同,在 C++14 中我会得到 bad alloc,我认为是从垃圾 std::string 的复制构造引起的:
附言:我知道如何修复这个问题,使用"static const auto& results"可以解决,就像之前提到的那样,这只是关于语言的边角情况的问题。
使用 -O3 -std=c++14 和 -O3 -std=c++17 标志时,以下代码的行为不同,在 C++14 中我会得到 bad alloc,我认为是从垃圾 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();
}
我的猜测是,C++17版本比C++14版本保留了底层数组更长的时间,但我在cppreference上没有找到有关初始化列表从C++14到C++17的相关变化,所以我很困惑。这只是UB存在的问题,还是语言发生了变化?附言:我知道如何修复这个问题,使用"static const auto& results"可以解决,就像之前提到的那样,这只是关于语言的边角情况的问题。