alf*_*les 5 c++ decltype c++builder-2010 c++11
我正在 CodeGear RAD Studio 中使用 decltype 编写一些代码。我尝试过简单的解决方案,它看起来与此没有什么不同:
\n\nint main(int, char**) {\n int i;\n int &ir = i;\n decltype((ir)) ir_clone = ir;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n当然,这无法编译:内部编译器错误。我相当怀疑该代码没有什么特别的错误,并且存在关于引用表达式的编译器错误。(顺便说一句,g++ 的代码没有问题,并且编译得很好。)但这无助于解决问题,因为平台是不可协商的。
\n\n如果上面我写了
\n\n decltype(ir) ir_clone = ir; /* No extra parens */\nRun Code Online (Sandbox Code Playgroud)\n\n它可以按预期编译并工作。然而,问题并没有就此结束,因为这不能正确计算环境的常量性。尤其:
\n\nstruct 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& */\nRun Code Online (Sandbox Code Playgroud)\n\n如果我不使用括号使参数成为表达式,我就会失去我需要的参数的常量性。
\n\n我\xc2\xa0可以使用的另一个工具是简单模板,如下所示:
\n\ntemplate<class T> struct unref { typedef T type; }\ntemplate<class T> struct unref<T&> { typedef T type; }\nRun Code Online (Sandbox Code Playgroud)\n\n这让我可以通过使用 来去除类型的引用部分unref<int&>::type。
我似乎无法弄清楚如何将所有这些工具组合在一起以获得 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>\nRun Code Online (Sandbox Code Playgroud)\n\n到目前为止,我的简单尝试失败了:
\n\nunref<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. */\nRun Code Online (Sandbox Code Playgroud)\n\n有什么想法可以让我走上正轨吗?希望我缺少一些简单的东西。也许我从错误的角度解决了这个问题。
\n尝试创建一个不同的、更复杂的表达式,以产生与您想要的相同类型,例如:
decltype((void(), ir))
Run Code Online (Sandbox Code Playgroud)
我无法告诉你为什么它可以解决这个问题,但有时不同的表达方式可以解决问题。
| 归档时间: |
|
| 查看次数: |
4436 次 |
| 最近记录: |