P0091R3 ("类模板模板实参推导") 最近被添加到 gcc
trunk 中,可以在 wandbox 上进行测试。
我心中想到的是使用它来用非常少的代码实现"作用域保护":
scope_guard _([]{ cout << "hi!\n" });
我尝试在wandbox上实现它...
template <typename TF>
struct scope_guard : TF
{
scope_guard(TF f) : TF{f} { }
~scope_guard() { (*this)(); }
};
int main()
{
scope_guard _{[]{}};
}
...但编译失败,出现了以下错误:
prog.cc:6:5: error: 'scope_guard(TF)-> scope_guard<TF> [with TF = main()::<lambda()>]', declared using local type 'main()::<lambda()>', is used but never defined [-fpermissive]
scope_guard(TF f) : TF{std::move(f)} { }
^~~~~~~~~~~
然后我尝试了使用非lambda本地类型,但是得到了相同的错误。
int main()
{
struct K { void operator()() {} };
scope_guard _{K{}};
}
之后,我尝试了一个非本地类型,它按预期工作。
struct K { void operator()() {} };
int main()
{
scope_guard _{K{}};
}
这个功能的设计是否防止本地类型被推断?
或者这是gcc
当前实现中的一个缺陷吗?