如何使用 decltype 获取引用的类型?

alf*_*les 5 c++ decltype c++builder-2010 c++11

我正在 CodeGear RAD Studio 中使用 decltype 编写一些代码。我尝试过简单的解决方案,它看起来与此没有什么不同:

\n\n
int main(int, char**) {\n    int i;\n    int &ir = i;\n    decltype((ir)) ir_clone = ir;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

如果上面我写了

\n\n
    decltype(ir) ir_clone = ir; /* No extra parens */\n
Run Code Online (Sandbox Code Playgroud)\n\n

它可以按预期编译并工作。然而,问题并没有就此结束,因为这不能正确计算环境的常量性。尤其:

\n\n
struct S { int i; } s;\nconst S* p = &s;\ndecltype(p->i)   i0 = s.i; /* i0 is an int */\ndecltype((p->i)) i1 = s.i; /* i1 is a const int& */\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
template<class T> struct unref     { typedef T type; }\ntemplate<class T> struct unref<T&> { typedef T type; }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这让我可以通过使用 来去除类型的引用部分unref<int&>::type

\n\n

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

\n\n
(vector<int>) vi          => vector<int>\n(vector<int>&)vir         => vector<int>\n(const vector<int>) cvi   => const vector<int>\n(const vector<int>&)cvir  => const vector<int>\n(const P*) cp->vi         => const vector<int>\n(P*) p->vi                => vector<int>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
unref<decltype(cp->vi)>   /* is vector<int>, not what I\xc2\xa0need. */\nunref<decltype((cp->vi))> /* is const vector<int>, which is right. */\n\nunref<decltype(vir)>      /* is vector<int>, which is right. */\nunref<decltype((vir))>    /* Internal Compiler Error, which is a headache. */\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

GMa*_*ckG 3

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

decltype((void(), ir))
Run Code Online (Sandbox Code Playgroud)

我无法告诉你为什么它可以解决这个问题,但有时不同的表达方式可以解决问题。