Как использовать operator = с анонимными объектами в C ++? - PullRequest
4 голосов
/ 13 февраля 2012

У меня есть класс с перегруженным оператором:

IPAddress& IPAddress::operator=(IPAddress &other) {
    if (this != &other) {
        delete data;
        this->init(other.getVersion());
        other.toArray(this->data);
    }
    return *this;
}

Когда я пытаюсь скомпилировать это:

IPAddress x;
x = IPAddress(IPV4, "192.168.2.10");

Я получаю следующую ошибку:

main.cc: In function ‘int main()’:
main.cc:43:39: error: no match for ‘operator=’ in ‘x = IPAddress(4, ((const std::string&)(& std::basic_string<char>(((const char*)"192.168.2.10"), ((const std::allocator<char>&)((const std::allocator<char>*)(& std::allocator<char>())))))))’
IPAddress.h:28:20: note: candidate is: IPAddress& IPAddress::operator=(IPAddress&)

Тем не менее, эти два прекрасно работают (хотя они не служат мне никакой цели):

IPAddress x;
IPAddress(IPV4, "192.168.2.10") = x;

-

IPAddress x;
x = *(new IPAddress(IPV4, "192.168.2.10"));

Что происходит?Я предполагаю что-то неправильное в том, как работает оператор присваивания?

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

Правая часть оператора присваивания должна принимать const IPAddress&.

Временные объекты могут быть связаны с константными ссылками, но не с неконстантными ссылками. Вот почему x = IPAddress(IPV4, "192.168.2.10"); не работает.

IPAddress(IPV4, "192.168.2.10") = x; работает, потому что разрешено вызывать функции-члены для временных объектов.

4 голосов
/ 13 февраля 2012

Оператор присваивания определяется с помощью const:

IPAddress& IPAddress::operator=(const IPAddress &other)

Ваш временный объект не может привязаться к неконстантной ссылке, поскольку он теоретически разрушается перед вызовом оператора присваивания (это может не произойтииз-за оптимизации, не надейтесь на это).

...