4

我正在使用 CodeGear RAD Studio 中的 decltype 处理一些代码。我已经尝试过天真的解决方案,它看起来与此不同:

int main(int, char**) {
    int i;
    int &ir = i;
    decltype((ir)) ir_clone = ir;
}

当然,这无法编译:Internal Compiler Error。我宁愿怀疑该代码没有什么特别的错误,并且存在与引用表达式有关的编译器错误。(顺便说一句,g++ 的代码没有问题并且编译得很好。)然而,这无助于解决问题,因为平台是不可协商的。

如果,上面,我写了

    decltype(ir) ir_clone = ir; /* No extra parens */

它按预期编译和工作。但是,问题并没有就此结束,因为这并不能正确地从环境中计算 constness。尤其是:

struct S { int i; } s;
const S* p = &s;
decltype(p->i)   i0 = s.i; /* i0 is an int */
decltype((p->i)) i1 = s.i; /* i1 is a const int& */

如果我不使用括号使参数成为表达式,我将失去参数的常量性,这是我需要的。

我可以使用的另一个工具是简单的模板,如下所示:

template<class T> struct unref     { typedef T type; }
template<class T> struct unref<T&> { typedef T type; }

这让我可以通过使用unref<int&>::type.

我似乎无法弄清楚如何将所有这些工具放在一起以获得我需要的类型的成功表达。对于我需要的一件事,我正在研究一个执行“foreach”的通用宏。(是的,我知道 Boost 做得更好。)它需要处理以下场景:

(vector<int>) vi          => vector<int>
(vector<int>&)vir         => vector<int>
(const vector<int>) cvi   => const vector<int>
(const vector<int>&)cvir  => const vector<int>
(const P*) cp->vi         => const vector<int>
(P*) p->vi                => vector<int>

到目前为止,我的简单尝试失败了:

unref<decltype(cp->vi)>   /* is vector<int>, not what I need. */
unref<decltype((cp->vi))> /* is const vector<int>, which is right. */

unref<decltype(vir)>      /* is vector<int>, which is right. */
unref<decltype((vir))>    /* Internal Compiler Error, which is a headache. */

有什么想法可以让我走上正轨吗?希望我缺少一些简单的东西。也许我从错误的角度解决了这个问题。

4

2 回答 2

2

尝试制作一个不同的、更复杂的表达式,以产生您想要的相同类型,例如:

decltype((void(), ir))

我无法告诉你为什么它会修复它,但有时不同的表达方式会起到作用。

于 2011-02-11T20:14:56.273 回答
2

您可以使用 std::remove_reference (请参阅http://en.cppreference.com/w/cpp/types/remove_reference)。

于 2016-06-20T10:28:40.973 回答