Pertanyaan Kesalahan memanggil operator yang ditentukan pengguna + pada objek sementara ketika ada tanda kurung ekstra


Jika saya memiliki definisi pengguna operator+() seperti dalam:

    class A
    {
    public:
        A operator+(A)
        {
            return A();
        }
    };

Maka, berikut berfungsi seperti yang diharapkan:

    A a = A() + A();

tetapi g ++ - 4.7 memberi pesan kesalahan pada yang berikut:

    A a = (A()) + A();

Pesan kesalahan khususnya adalah error: no match for ‘operator+’ in ‘+A()’.
Sepertinya itu (A()) sedang diabaikan dalam ekspresi.

Pertanyaan saya adalah: is A a = (A()) + A(); seharusnya mengkompilasi dan jika tidak, mengapa tidak?

Catatan: ini terjadi pada saya ketika saya melakukannya #define X (Identity()) lalu coba lakukan X + X.


32
2018-05-20 03:20


asal


Jawaban:


Ini sintaks cast.

Alasannya adalah bahwa casting dan penambahan, pengurangan dan perkalian yang tidak benar (operator dereference) memiliki prioritas yang lebih tinggi daripada rekan biner mereka. Karena ruang putih di sini tidak masalah ini juga dapat dibaca sebagai:

    A a = (A()) +A();

Para pemain dan unary+ memiliki prioritas yang lebih tinggi daripada biner operator+ jadi ungkapan itu mengambil arti yang pertama.

Anda mungkin bertanya-tanya (seperti yang saya lakukan) bagaimana Anda dapat melakukan cast ketika benda di dalamnya bukan tipe. Memasukkan PARLEM PALING BERBEDA!, yang berarti saya mencoba untuk mentransmisikan objek bertipe +A() ke fungsi mengambil 0 argumen dan mengembalikan objek tipe A.

Sebagai catatan, sintaksnya:

    A a = ((A())) + A();

memberikan apa yang Anda inginkan karena kurung ganda tidak bisa menjadi pemain dan kita kembali ke parsing biner operator+ ekspresi.

Ini juga menjelaskan mengapa masalah tidak terjadi dengan operator divisi, bukan penambahan, tidak memiliki mitra yang tidak seimbang.


46
2018-05-20 03:53