mam następujący program testowy:tymczasowej tablicy const nie wiąże się odniesienie rvalue
#include <iostream>
#include <type_traits>
#include <utility>
template<typename Ty, std::size_t N>
void foo(Ty (&&)[N])
{
std::cout << "Ty (&&)[" << N << "]\t" << std::is_const<Ty>::value << '\n';
}
template<typename Ty, std::size_t N>
void foo(Ty (&)[N])
{
std::cout << "Ty (&)[" << N << "]\t" << std::is_const<Ty>::value << '\n';
}
template<typename Ty>
using id = Ty;
int main()
{
std::cout.setf(std::cout.boolalpha);
foo(id<int[]>{1, 2, 3, 4, 5});
foo(id<int const[]>{1, 2, 3, 4, 5}); // <-- HERE.
int xs[]{1, 2, 3, 4, 5};
foo(xs);
int const ys[]{1, 2, 3, 4, 5};
foo(ys);
foo(std::move(xs));
foo(std::move(ys));
}
Spodziewam się, że linia oznaczona strzałką nazwałbym przeciążenie rvalue jak non-const rozmowy tuż nad nim, ale tak nie jest.
Czy to tylko błąd w GCC, czy jest coś w standardzie, które powoduje przeciążenie lwartością?
Ciekawe, Clang dostaje to poprawnie i wywołuje przeciążenie rwartości. – Xeo
Dobre pytanie: moje naiwne zrozumienie standardu zgadza się z twoim. [Live] (http://ideone.com/ErHuYO), jeśli chcesz zobaczyć wyjście. – Yakk
Coś zabawnego dzieje się tutaj: http://ideone.com/ptTJ8i - moje 'const int' temporary traktowane jest jak' int && ', a nie' const int && '. – Yakk