【发布时间】:2019-12-17 18:36:22
【问题描述】:
首先这是一个好奇的问题,在现实生活中我永远不会写这样的代码。
以下代码的行为与 -O3 -std=c++14 和 -O3 -std=c++17 标志不同,在 C++14 中我得到了错误的分配,我假设从垃圾 std:: 复制构造字符串:
#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是UB,还是语言改变了?
附:我知道如何解决这个问题,使用static const auto& results 作品,就像之前提到的,这只是一个关于语言极端情况的问题。
【问题讨论】:
-
AFAIK 生命周期的变化是从 C++11 到 C++14。代码在 C++14 或 C++17 中应该没问题,所以不确定发生了什么。 GCC 在 14 或 17 模式下工作。
-
也适用于 MSVC 上的 14 和 17。
标签: c++ clang language-lawyer c++17 stdinitializerlist