Rokiのチラ裏

学生による学習のログ

Unqualified enumerators in case labels

標準化委員会の文書:Unqualified enumerators in case labels
switch文内でスコープ解決を行っているコード。

enum struct foo{bar,baz};

namespace n{
    enum n_foo{pub,bar,tavern};
};

auto f(const foo& f,const n::n_foo& n_f)->const std::pair<int,int>&&
{
    std::array<int,2> result{-1,-1};
    switch(f){
        case foo::bar: 
            result[0]=1; break;
        case foo::baz:
            result[0]=2; break;
    }

    switch(n_f){
        case n::pub:
            result[1]=1; break;
        case n::bar:
            result[1]=2; break;
        case n::tavern:
            result[1]=3; break;
    }

    return std::move(std::make_pair(result.at(0),result.at(1)));
}

これが、以下のように書けるようになる。

enum struct foo{bar,baz};

namespace n{
    enum n_foo{pub,bar,tavern};
};

auto f(const foo& f,const n::n_foo& n_f)->const std::pair<int,int>&&
{
    std::array<int,2> result{-1,-1};
    switch(f){
        case bar: 
            result[0]=1; break;
        case baz:
            result[0]=2; break;
    }

    switch(n_f){
        case pub:
            result[1]=1; break;
        case bar:
            result[1]=2; break;
        case tavern:
            result[1]=3; break;
    }

    return std::move(std::make_pair(result.at(0),result.at(1)));
}

これは確かにセマンティック的に、名前解決をわざわざしなくても見つけられるようにしておくべきで、規格化すればとても便利な内容となるだろう。