나는 다음과 같은 테스트 프로그램이 있습니다임시 CONST 배열이를 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));
}
내가 라인 바로 위에 const가 아닌 전화와 같은를 rvalue 과부하를 부를 것이다 화살표로 표시된 것으로 기대를하지만, 그렇지 않습니다.
이것은 GCC의 버그일까요? 아니면 lvalue 오버로드를 선택하게하는 표준에 뭔가가 있습니까?
흥미 롭다면, Clang은 이것을 올바르게 받아서 rvalue overload를 호출합니다. – Xeo
좋은 질문 : 표준에 대한 내 순진한 이해는 자신의 의견에 동의합니다. [라이브] (http://ideone.com/ErHuYO) 출력을보고 싶다면. – Yakk
재미있는 일이 여기 있습니다 : http://ideone.com/ptTJ8i - 제 'const int'임시는'const int &&'가 아닌'int &&'처럼 취급되고 있습니다. – Yakk