构造一个没有默认构造函数的空对象

时间:2019-07-12 13:13:00

标签: c++ language-lawyer c++17 empty-class

假设我的类型为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);

2 个答案:

答案 0 :(得分:4)

对于您自己的类型,可以从自身复制或移动构造对象:F f = f。这本身并不会导致UB,请参见CWG363。 但是,对于编译器提供的闭包类型,即使您知道它为空,也不清楚。

答案 1 :(得分:3)

  

但是F没有默认的构造函数

如果是这种情况,则用户要么显式删除它,要么隐式删除它,因为用户提供了其他构造函数。无论哪种情况,类型都不是简单的。

如果对象不是非私有对象,则要创建类型为而没有从现有实例中复制/移动的对象,必须显式调用某种构造函数。没有解决的办法。

即使联合的常见初始序列规则也不允许您创建另一个对象。它仅允许访问另一个对象的非静态数据成员。由于您的对象是空的,因此对您没有任何意义。