tôi có chương trình thử nghiệm sau đây:mảng const tạm thời không liên kết với tài liệu tham khảo 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));
}
Tôi hy vọng rằng các dòng được đánh dấu bằng một mũi tên sẽ gọi quá tải rvalue như các cuộc gọi không const chỉ ở trên nó nhưng nó không.
Đây có phải chỉ là lỗi trong GCC hoặc có điều gì đó trong tiêu chuẩn gây ra quá tải lvalue được chọn không?
Thú vị, Clang nhận được điều này đúng và gọi quá tải rvalue. – Xeo
Câu hỏi hay: sự hiểu biết ngây thơ của tôi về tiêu chuẩn đồng ý với bạn. [Live] (http://ideone.com/ErHuYO) nếu bạn muốn xem đầu ra. – Yakk
Điều gì đó buồn cười xảy ra ở đây: http://ideone.com/ptTJ8i - 'const int' tạm thời của tôi đang được xử lý như một' int && ', không phải là 'const int &&'. – Yakk