Назначение и конструктор в C ++ [дубликат]

При обновлении до Xcode 7.1 вы можете увидеть этот тип ошибки, и он не может быть разрешен ни одним из приведенных выше ответов. Одним из симптомов в моем случае было то, что приложение работает на устройстве не в симуляторе. Вероятно, вы увидите огромное количество ошибок, связанных со значительной частью всех используемых вами фреймворков.

Исправление на самом деле довольно простое. Вам просто нужно удалить запись из параметра «Пути поиска в Ракурсе», найденного в разделе TARGETS> Build Settings> Search Paths (убедитесь, что выбрана вкладка «Все»)

Если вы видите другую запись (помимо $ (унаследованной)) для своей основной цели или вашей целевой цели, просто удалите неисправный путь из всех целей и перестройте.

8
задан M.M 4 November 2015 в 03:36
поделиться

2 ответа

Почему здесь выбрано operator=(int) вместо «двусмысленного» или другого?

{} - int - это преобразование идентичности ( [over.ics.list] / 9 [/ д0]). {} - S - пользовательское преобразование ( [over.ics.list] / 6 ) (технически это {} до const S& и проходит через [over.ics .list] / 8 и [over.ics.ref], прежде чем вернуться к [over.ics.list] / 6).

Первый выигрыш.

Есть ли способ обхода?

Вариант трюка std::experimental::optional тянет, чтобы t = {} всегда делал t пустым. Ключ должен сделать шаблон operator=(int). Если вы хотите принять int и только int, тогда он станет

template<class Int, std::enable_if_t<std::is_same<Int, int>{}, int> = 0>
S& operator=(Int t) { a = t; return *this; }

. Если вы хотите включить конверсии, вы можете использовать различные ограничения (вы, вероятно, также захотите принять аргумент ссылка в этом случае).

Суть в том, что, создав параметр правильного операнда для параметра шаблона, вы блокируете t = {}, используя эту перегрузку, потому что {} - это не выводимый контекст.

... без изменения S?

Считает ли template<class T> T default_constructed_instance_of(const T&) { return {}; }, а затем s = default_constructed_instance_of(s);?

11
ответ дан T.C. 20 August 2018 в 12:38
поделиться
  • 1
    Хех, в отношении последней строки, с которой я перешел с template<typename T> void reset(T &t) { t = T{}; } – M.M 4 November 2015 в 04:02

Прежде всего, случай не имеет ничего общего с «int» версией оператора присваивания, вы можете просто удалить его. Вы также можете удалить другой оператор присваивания, так как он будет сгенерирован компилятором. IE такого типа автоматически получает конструкторы копирования / перемещения и оператор присваивания. (т. е. они не запрещены, и вы просто повторяете то, что компилятор делает автоматически с явным обозначением)

В первом случае

используется инициализация копирования :

S s = {};     // the default constructor is invoked

Это назначение пост-строительной копии, но компиляторы оптимизируют такие простые случаи. Вместо этого вы должны использовать инициализацию направления :

S s{};        // the default constructor is invoked (as you have it)

Примечание: вы также можете записать:

S s;          // the default constructor is invoked if you have it

Второй случай

То, что вы должны написать, это прямая инициализация правой стороны назначения копии:

t = S{};

В этой нотации будет вызываться конструктор по умолчанию (если он есть) или инициализация значения для членов (пока тип является агрегатом). Вот соответствующая информация: http://en.cppreference.com/w/cpp/language/value_initialization

-2
ответ дан os_ 20 August 2018 в 12:38
поделиться
  • 1
    я все еще не понимаю, что делает его второй случай (как написано) – pm100 4 November 2015 в 02:32
  • 2
    если я удалю "int" версии оператора присваивания, то выход будет 5 5 – M.M 4 November 2015 в 03:35
Другие вопросы по тегам:

Похожие вопросы: