Vit*_*meo 8 c++ gcc segmentation-fault undefined-behavior c++17
#include <utility>
template <typename P, typename F>
struct foo
{
P _p;
int i{0};
foo(P&& p, F) : _p{std::move(p)} { }
template <typename... Cs>
void up(Cs&... cs)
{
if constexpr(sizeof...(Cs) == 2) { down(cs...); }
else { _p.up(*this, cs...); }
}
void down() { --i; }
template <typename C, typename... Cs>
void down(C& c, Cs&... cs)
{
[&] { [&] { c.down(cs...); }(); }();
}
};
int main()
{
auto f = foo{foo{foo{0, 0}, 0}, 0};
f.up();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码片段:
使用g ++ 7.1和trunk编译时,始终会执行段错误-O0
.
始终报告使用g ++ 7.1和trunk编译时的执行错误,具有任何优化级别和任一-fsanitize=address
或-fsanitize=undefined
.
切勿使用clang ++ 5和trunk报告段或报告任何清洁剂错误.
采取以下任何措施:
摆脱--i;
从down()
.
更改[&] { [&] { c.down(cs...); }(); }();
到[&] { c.down(cs...); }();
.
相应地删除typename F
和更新构造函数.
更改foo{foo{foo{0, 0}, 0}, 0}
到foo{foo{0, 0}, 0}
.
修复了分段故障并防止任何消毒剂错误.
这里发生了什么?我的代码是不正确的,还是这是一个奇怪的gcc错误导致错误的汇编?
归档时间: |
|
查看次数: |
123 次 |
最近记录: |