假设我的类型为F
。我知道F
是空的,但是F
没有默认的构造函数,所以我不能使用F()
来构造它。无论如何,有没有一种方法可以获取类型为F
的有效对象?我似乎还记得有人提到过,有一种奥秘地使用工会的方法。理想情况下,它将是constexpr
友好的。
这很有用,因为无捕获的lambda仅在C ++ 20中获得了默认构造函数。在C ++ 17中,如果我想“将lambda传递给模板”并在不具有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);
答案 0 :(得分:4)
对于您自己的类型,可以从自身复制或移动构造对象:F f = f
。这本身并不会导致UB,请参见CWG363。
但是,对于编译器提供的闭包类型,即使您知道它为空,也不清楚。
答案 1 :(得分:3)
但是
F
没有默认的构造函数
如果是这种情况,则用户要么显式删除它,要么隐式删除它,因为用户提供了其他构造函数。无论哪种情况,类型都不是简单的。
如果对象不是非私有对象,则要创建类型为而没有从现有实例中复制/移动的对象,必须显式调用某种构造函数。没有解决的办法。
即使联合的常见初始序列规则也不允许您创建另一个对象。它仅允许访问另一个对象的非静态数据成员。由于您的对象是空的,因此对您没有任何意义。