c++ - 通过类成员访问运算符访问作用域枚举器
问题描述
样品单位:
struct Supercalifragilisticexpialidocious
{
enum class Frob
{
Foo, Bar, Baz, Qux
};
Frob frob;
};
Supercalifragilisticexpialidocious maker();
void f()
{
auto g = maker();
// Allowed?
if ( g.frob == g.Frob::Baz ) {}
}
此代码被 gcc 9.x 和 10.x 接受,但被 clang 10.x 和 11.x(godbolt 链接)拒绝,并出现如下错误:
<source>:17:28: error: 'Supercalifragilisticexpialidocious::Frob::Baz' is not a member of class 'Supercalifragilisticexpialidocious'
我的问题是:这段代码是否正确(即它只是一个clang错误?)
背景:我想测试g.frob == Supercalifragilisticexpialidocious::Frob::Baz
但不必重复类名。在更一般的情况下,我们通过 获取对象auto
,类名可能不会立即显而易见,或者可能由于模板而变得困难。
我想出了一种解决方法,decltype(g)::Frob::Baz
它似乎在上述代码的两个编译器中都有效——尽管如果g
是参考,这再次被 gcc 接受并被 clang 拒绝。
解决方案
推荐阅读
- windows - 禁用 Hyper-V - 有什么方法可以进行 2 次引导登录
- c# - 列表项消失得无影无踪
- ruby-on-rails - 如何将超链接添加到铁路上的另一个控制器红宝石?
- php - XPATH - 用于计数目的的多于 1 个文本的规范化空间
- python - (错误代码:10011):discord.py 1.7.3 版中的未知角色
- javascript - Datalabels 插件 chartjs 显示 '[object]' 而不是 value
- python - 如何在不使用 time.sleep 方法的情况下在 python 中进行倒计时?
- r - 来自 Reactive Function 的 RShiny DT 函数(参数长度为零错误)
- angular - Abp.io Angular UI - 使用 ListService 过滤
- android - MPAndroidCharts 圆角 Kotlin