3

假设我有一个 type 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);
4

2 回答 2

6

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

于 2019-07-12T18:49:39.767 回答
3

F没有默认构造函数

如果是这种情况,那么用户要么显式删除它,要么因为用户提供了其他构造函数而被隐式删除。在任何一种情况下,类型都不是 Trivial。

如果一个对象是非平凡的,那么要创建该类型的对象而不从现有实例复制/移动,您必须显式调用某种构造函数。没有办法解决这个问题。

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

于 2019-07-12T13:39:10.303 回答