【发布时间】:2019-11-22 06:23:41
【问题描述】:
假设我有一个类型F。我知道F是空的,但是F没有默认构造函数,所以我不能用F()来构造它。有没有办法获得F 类型的有效对象?我似乎记得提到过,有一种方法可以神秘地使用联合。理想情况下,它应该是 constexpr 友好的。
这很有用,因为无捕获 lambda 仅在 C++20 中获得了默认构造函数。在 C++17 中,如果我想“将 lambda 传递给模板”并在没有它的实例的情况下调用该 lambda,我需要能够从类型重构它。
auto const f = [](int x) { return x; };
using F = decltype(f);
static_assert(std::is_empty_v<F>);
static_assert(!std::is_default_constructible_v<F>);
magically-construct-an-F(42);
【问题讨论】:
-
"在 C++17 中,如果我想“将 lambda 传递给模板”" 就不要这样做了。只需创建一个带有
operator()重载的struct。打字不多:struct F {auto operator()(int x) {return x;}}; -
什么模板要默认构造函数对象?您是否要排除实际功能?
-
@Caleth:例如,给
std::set/map的比较函子。它必须是可默认构造的,以便可以用于比较元素。 -
@Caleth 简而言之,对于我的特定用例,这允许您将空对象的成员函数提升为静态成员函数,从而为您节省一个指针参数。在我的特定用例中,编译器无法删除该指针。而且,对于我的特定用例,我找到了一种可能的解决方法。
标签: c++ language-lawyer c++17 empty-class