Разрешение перегрузки с ref-определителями

Работая с перегрузками функций с квалификацией ref, я получаю разные результаты отGCC (4.8.1) а такжеЛязг (2,9 и багажник), Рассмотрим следующий код:

#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();
}

лязг компилирует и выводит"const rvalue", покаНКУ считает, что это неоднозначный вызов с двумя константными функциями, обе из которых являются наиболее подходящими кандидатами. Если я предоставлю все 4 перегрузки, то оба компилятора выведут"non-const rvalue".

Я хотел бы знать, какой компиляторесли есть делает правильные вещи, и каковы соответствующие стандартные пьесы в игре.

Примечание: Причина, по которой это на самом деле имеет значение, состоит в том, что реальный код объявляет обе функции с константойconstexpr, Конечно, нет выхода наstd::cout а такжеstatic_cast используется вместоstd::moveтак, чтобы они действовалиconstexpr определения. И так как вC ++ 11 constexpr все еще подразумеваетconstперегрузка, закомментированная в примере кода, не может быть предоставлена, так как она переопределит квалифицированную const перегрузку rvalue.

Ответы на вопрос(1)

Ваш ответ на вопрос