2

我需要自动从某种语言翻译成 C++。源语言具有Statement Exprs的等价物,我在标准 C++(实际上是 C++11)上复制它时遇到了很多困难。

起初我考虑了 lambdas,但结果非常难看(lambdas 中的 lambdas 中的 lambdas...),并且在应用于大型源时可能会使编译器陷入困境。

我怎样才能复制那个 GNU 扩展?必须维护有关构造/销毁/复制/等的语义,因此翻译如下:

Foo foo( { ... declarations and statements ... } );

进入这个:

Foo foo;
... declarations and statements ...
foo = last result;

不正确(因为Foo使用默认构造函数构造然后分配,而不是使用语句块的最后一个值构造。此外,在语句块内创建的对象在每种情况下都有不同的生命周期。)

请注意,这个问题也适用于使用该扩展的程序需要翻译成标准 C++ 的情况。

4

3 回答 3

1

Lambdas 实际上是正确的翻译。毕竟,它们具有您所希望的语义,并且 Herb Sutter 本人在const 变量的复杂初始化中也这样描述了它们。

如果您不想使用 lambda,或者买不起 C++11,另一种解决方案是转向boost::optional

boost::optional<Foo> foo_;
{
    // init computations
    foo_ = Foo(....);
}
Foo& foo = *foo_;
于 2013-09-08T12:31:45.627 回答
1

可能有效:

uint8_t foo[sizeof (Foo)];
do {
  /* declarations and statements */
  new (foo) Foo (/*last result*/);
} while (0);

然后将每个对 foo 的引用替换为

*((Foo *) foo)
于 2013-09-08T11:06:06.373 回答
1

那这个呢:

Foo foo ([]() -> some_type { blah blah; return last_result; } ());

缺点(除了冗长之外)是您无法推断 lambda 的返回类型,除非一切都适合 return 语句。不过,C++1y 似乎可以解决这个问题。

于 2013-09-08T11:18:03.673 回答