Resolução de sobrecarga com qualificadores ref

Ao trabalhar com sobrecargas de funções qualificadas por ref, estou obtendo resultados diferentes deGCC (4.8.1) eClang (2.9 e tronco). Considere o seguinte código:

#include <iostream>
#include <utility>

struct foo
{
    int& bar() &
    {
        std::cout << "non-const lvalue" << std::endl;
        return _bar;
    }
    //~ int&& bar() &&
    //~ {
    //~     std::cout << "non-const rvalue" << std::endl;
    //~     return std::move(_bar);
    //~ }
    int const& bar() const &
    {
        std::cout << "const lvalue" << std::endl;
        return _bar;
    }
    int const&& bar() const &&
    {
        std::cout << "const rvalue" << std::endl;
        return std::move(_bar);
    }

    int _bar;
};

int main(int argc, char** argv)
{
    foo().bar();
}

Clang compila e saídas"const rvalue", enquantoGCC acha que esta é uma chamada ambígua com as duas funções const-qualificadas sendo ambas as melhores candidatas viáveis. Se eu fornecer todas as 4 sobrecargas, então ambos os compiladores saem"non-const rvalue".

Eu gostaria de saber qual compilador--caso existam-- está fazendo a coisa certa, e quais são as peças padrão relevantes em jogo.

Nota: A razão pela qual isso realmente importa é que o código real declara ambas as funções qualificadas comoconstexpr. Claro, não há saída parastd::cout estatic_cast é usado em vez destd::move, para que sejam válidosconstexpr definições. E desde entãoC ++ 11 constexpr ainda implicaconst, a sobrecarga comentada no código de exemplo não pode ser fornecida, pois redefiniria a sobrecarga rvalue qualificada para const.

questionAnswers(1)

yourAnswerToTheQuestion