cuốn sách gpt4 ai đã làm

Tiếng kêu không rõ ràng với toán tử chuyển đổi tùy chỉnh

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 23:29:55 29 4
mua khóa gpt4 Nike

Tôi đang phát triển một lớp bộ điều hợp khi gặp sự cố với tiếng kêu. Khi các toán tử chuyển đổi cho tham chiếu lvalue và tham chiếu rvalue được xác định, bạn sẽ gặp lỗi biên dịch không rõ ràng khi cố gắng di chuyển ra khỏi lớp của mình (khi mã đó sẽ ổn, ví dụ:

toán tử const T& () const&

Chỉ được phép đối với giá trị AFAIK). Tôi đã sao chép lỗi bằng một ví dụ đơn giản:

#include 

lớp StringDecorator
{
public:
StringDecorator()
: m_string( "Chuỗi dữ liệu ở đây")
{}

toán tử const std::string& () const& // chỉ giá trị
{
trả về m_string;
}

toán tử std::string&& () && // chỉ giá trị
{
trả về std::move( m_string );
}

private:
std::string m_string;
};

void func( const std::string& ) {}
void func( std::string&& ) {}

int main(int argc, char** argv)
{
StringDecorator my_string;

func( my_string ); // ổn, toán tử std::string&& không được phép
func( std::move( my_string ) ); // lỗi "gọi hàm không rõ ràng"
}

Biên dịch tốt trên gcc 4.9+, không thành công trên mọi phiên bản clang. Vậy câu hỏi là: có giải pháp nào không? tôi đúng hằng số& Sự hiểu biết của bạn về công cụ sửa đổi chức năng có đúng không?

Tái bút: Để làm rõ - câu hỏi là về việc sửa chính lớp StringDecorator (hoặc tìm cách giải quyết cho lớp này, như thể đó là mã thư viện). Vui lòng không cung cấp câu trả lời gọi trực tiếp toán tử T&&() hoặc chỉ định rõ ràng loại chuyển đổi.

câu trả lời hay nhất

Vấn đề nảy sinh từ việc lựa chọn hàm khả thi tốt nhất. trong lần thứ hai vui vẻ gọi, nó có nghĩa là so sánh 2Trình tự chuyển đổi do người dùng xác định. Thật không may, nếu 2Trình tự chuyển đổi do người dùng xác địnhkhông sử dụng cùng hàm chuyển đổi hoặc hàm tạo do người dùng xác định, chúng sẽkhông thể phân biệt được tiêu chuẩn C++ [over.ics.rank/3]:

Hai chuỗi chuyển đổi ngầm có cùng dạng là các chuỗi chuyển đổi không thể phân biệt được trừ khi áp dụng một trong các quy tắc sau:

  • […]

  • Trình tự chuyển đổi do người dùng xác định U1 là trình tự chuyển đổi tốt hơn trình tự chuyển đổi do người dùng xác định khác U2 nếu chúng chứa cùng hàm chuyển đổi hoặc hàm tạo do người dùng xác định […]

Bởi vì các giá trị luôn có thể bị ràng buộc với các tham chiếu const lvalue, nếu hàm này const std::string&std::overload, dù sao thì bạn cũng bị mắc kẹt với cuộc gọi mơ hồ này: string&&.

Như bạn đã đề cập, câu trả lời đầu tiên của tôi là khai báo lại tất cả các hàm, đây không phải là giải pháp vì bạn đang triển khai một thư viện. Trên thực tế, không thể tính hết được tất cả sợi dây Chức năng như tham số xác định chức năng proxy!!

Bằng cách này, bạn có sự cân bằng giữa 2 giải pháp không hoàn hảo:

  1. bạn xóa toán tử std::string&&() &&, bạn sẽ mất một số tối ưu hóa, hoặc;

  2. Bạn kế thừa từ std::string một cách công khai và xóa 2 chức năng chuyển đổi, trong trường hợp đó thư viện của bạn có thể bị lạm dụng:

    #include 

    lớp StringDecorator
    : std công khai::chuỗi
    {
    public:
    StringDecorator()
    : std::string("Chuỗi dữ liệu ở đây" )
    {}
    };

    void func( const std::string& ) {}
    void func( std::string&& ) {}

    int main(int argc, char** argv)
    {
    StringDecorator my_string;

    func( my_string ); // ổn, toán tử std::string&& không được phép
    func( std::move( my_string )); // Không còn lỗi:
    // thứ hạng của chuỗi chuyển đổi tiêu chuẩn được làm mịn.
    }

Một giải pháp khác là không sử dụng Clang như hiện tại lỗi của Clang .

Nhưng nếu bạn phải sử dụng Clang, câu trả lời của Tony Frolov chính là giải pháp.

Về C++ - Sự mơ hồ về tiếng kêu của các toán tử chuyển đổi tùy chỉnh, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/47658431/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress