Почему среда IDE выдает предупреждение, когда я пытаюсь вызвать конструктор из функции-члена? - PullRequest
1 голос
/ 23 мая 2019

Я пытаюсь взять объект по ссылке на функцию-член в качестве аргумента и назначить его новому объекту. Среда IDE выдает предупреждение о том, что мне следует избегать использования неназванных объектов с пользовательским построением и уничтожением. Поэтому я спрашивал об альтернативе для этого или чтобы понять, что означает предупреждение.

Я использую C ++ 17, программа работает нормально и все хорошо, но я просто не знаю альтернативы, чтобы избавиться от предупреждения.

Фактическое предупреждающее сообщение: Warning C26444 Avoid unnamed objects with custom construction and destruction (es.84). Project2 c:\xx\repos\project2\project2\big_int.cpp 304

void big_int::copyInto(big_int& b) {
    b = big_int{this->data}; // this->data is string
}

Предположим, что есть конструктор для класса big_int, который принимает string, эта строка дает мне упомянутое предупреждение.

p.s .: Я знаю, что это именно работа самого конструктора копирования, но я просто привел пример, чтобы проработать мою проблему.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Nitpick: это не вызов конструктора. Это невозможно сделать напрямую. Синтаксис выглядит так, но синтаксиса для этого нет.

На самом деле вы создаете временный типа big_int и присваиваете ему b.

И я не могу думать ни о чем плохом Странное предупреждение.

Вы можете обойти это, подняв новый объект в именованную переменную, затем move - присвоив его, но этот код более многословен и IMO совершенно не нужен. (И я думаю это запрещает гарантированное исключение? Не уверен, что это относится к этому конкретному примеру, но эй.)

Я бы просто отключил предупреждение.

0 голосов
/ 23 мая 2019

Избегайте неназванных объектов [..]

Так назовите его:

void big_int::copyInto(big_int& b) {
    auto temp = big_int{this->data}; // this->data is string
    b = std::move(temp);
}

или отключите предупреждение явно

void big_int::copyInto(big_int& b) {
#pragma warning (push)
#pragma warning (disable : 26444) // Avoid unnamed objects with custom construction and destruction
    b = big_int{this->data}; // this->data is string
#pragma warning (pop)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...