Разрешение перегрузки с 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.