M.M*_*M.M 7 c++ enums clang scoped-enums
样品单位:
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 ) {}
}
Run Code Online (Sandbox Code Playgroud)
此代码被 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'
Run Code Online (Sandbox Code Playgroud)
我的问题是:这段代码是否正确(即它只是一个叮当声错误?)
背景:我想测试g.frob == Supercalifragilisticexpialidocious::Frob::Baz但不必重复类名。在我们通过 获取对象的更一般情况下auto,类名可能不会立即明显,或者可能由于模板而变得困难。
我想出了一个解决方法,decltype(g)::Frob::Baz它似乎在上述代码的两个编译器中都有效——尽管如果g是参考,这再次被 gcc 接受并被 clang 拒绝。