Pracując z przeciążeniami funkcyjnych Ref-wykwalifikowanych, Dostaję różne wyniki od GCC (4.8.1) i dzyń (2,9 i tułowia). Rozważmy następujący kod:rozdzielczości Przeciążenie z Ref-kwalifikatorów
#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 kompiluje go i wyjść "const rvalue"
, natomiast GCC myśli, że to jest niejednoznaczne wywołanie z dwóch wykwalifikowanych const funkcji obie będące najlepszym realne kandydatów. Jeśli dostarczę wszystkie 4 przeciążenia, oba kompilatory wypiszą "non-const rvalue"
.
Chciałbym wiedzieć, który kompilator - jeśli jakikolwiek - robi dobrą rzecz i jakie są odpowiednie standardowe elementy w grze.
Uwaga: Powodem jest rzeczywiście ważne jest to, że prawdziwy kod deklaruje obie funkcje const zakwalifikowanych jako constexpr
. Oczywiście nie ma wyjścia do std::cout
i static_cast
jest używane zamiast std::move
, więc są one ważne definicje constexpr
. A ponieważ w C++ 11 nadal implikuje const
, nie można zapewnić przeciążenia skomentowanego w przykładowym kodzie, ponieważ spowodowałoby to przedefiniowanie przeciążenia o wartości stałej rownoważnej.
Wartość odniesienia rvalue lepiej pasuje we wszystkich przypadkach. Prawdopodobnie jest to błąd związany z refart kwalifikatorami GGC. – Xeo
Również, [ta odpowiedź] (http://stackoverflow.com/a/8610728/500104) może być istotna. ;) – Xeo
Dziękujemy za szczegółową odpowiedź. Żałuję, że nie mogłem tego zrobić więcej niż raz! –