【发布时间】:2017-04-28 12:15:21
【问题描述】:
#include <iostream>
using namespace std;
struct A
{
A() { cout << "A" << endl; }
~A() { cout << "~A" << endl; }
};
A Ok() { return {}; }
A NotOk() { throw "NotOk"; }
struct B
{
A a1;
A a2;
};
void f(B) {}
int main()
{
try
{
f({ Ok(), NotOk() });
}
catch (...)
{}
}
vc++ 和 clang 输出:
A
~A
而gcc 输出:
A
这似乎是 GCC 的一个严重错误。
有关参考,请参阅GCC bug 66139 和"A serious bug in GCC" by Andrzej Krzemieński。
我只是想知道:
C++ 标准是否保证统一初始化是异常安全的?
【问题讨论】:
-
什么版本的 GCC 展示了这个?
-
@einpoklum all.
-
我不认为异常安全是一个问题。除非 1) 通过 exit() 立即退出应用程序,2) 未定义的行为,- 如果对象在自动范围内构造,则必须在执行离开其范围时将其销毁。这是 C++ 的基础。这是一个编译器错误。
-
首先我认为这可能是一些愚蠢的优化,因为静态分析表明程序会立即在那个包罗万象的处理程序上退出。但不,这是一个编译器错误。 A very major and horrible bug.
-
所以你有一个博客说这是一个错误,还有一个 gcc 错误报告说并确认它是一个错误......但是你有一个问题问它是否是一个错误?
标签: c++ exception gcc c++17 uniform-initialization