Các công việc sau tốt (như mong đợi):Template chuyển đổi sang const tham chiếu
struct X {};
struct A
{
operator X const&()
{
static const X value{};
return value;
}
};
int main()
{
A a;
X x = a;
}
Nhưng điều này không phải là quá rõ ràng:
template<typename T>
struct X {};
struct A
{
template<typename T>
operator X<T> const&()
{
static const X<T> value{};
return value;
}
};
int main()
{
A a;
X<int> x = a;
}
GCC 4.9 nói error: conversion from ‘A’ to non-scalar type ‘X<int>’ requested
trong khi kêu vang 3,4 có không có vấn đề với nó. Nếu bạn xóa const
hoặc &
khỏi chức năng chuyển đổi hoặc nếu bạn viết X<int> const &x = a
thì GCC cũng vui.
Vì vậy GCC chỉ không tìm thấy hàm chuyển đổi nếu loại mục tiêu là const &
đối với lớp mẫu và bạn yêu cầu chuyển đổi thành đối tượng không phải const &
của lớp đó. Đây có phải là hành vi đúng không? Tôi đã cố gắng để đọc tiêu chuẩn nhưng các quy tắc quá tải khá khó hiểu với tôi.
Nhờ lời giải thích tuyệt vời của bạn và liên kết đến báo cáo lỗi tôi đã gửi báo cáo lỗi: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61663 –