Неявный конструктор не распознается

Я пытаюсь понять, почему компилятор не выводит, что он должен использовать строковый конструктор Obj.

Должна ли быть разрешена неявная конструкция для этого случая? (я передаю опорную строку const и const reference Obj) Разве это не вся идея неявного построения? что мне здесь не хватает?

class Obj
{
public: Obj(const std::string& str) { } void operator+=(const Obj& other) { cout << "operator+=" << endl; } Obj& operator++() { operator +=("something"); // error return *this; }
};

Я компилирую с gcc 4.8.2, спасибо!

2 ответа

Преобразование из строкового литерала "something" в Obj потребует двух определяемых пользователем преобразований: один из строкового литерала в std::string и один из std::string в Obj с использованием вашего конструктора. Неявные последовательности преобразования ограничиваются только одним пользовательским преобразованием.

Лучший способ решить эту проблему - добавить еще один конструктор, который принимает строку C,

Obj(const char* str)

Если вы не хотите добавлять такой конструктор и хотите выполнить это преобразование всего один раз, вы можете:

  1. Напишите operator+=(std::string("something")) (явно выполните первое преобразование)
  2. (С++ 14) Напишите operator+=("something"s), в котором используется новый определяемый пользователем суффикс буква s для построения std::string


Вам не разрешено более одного определенного пользователем преобразования. У вас две, char* для std::string и std::string для Obj. Вы можете исправить это, передав std::string на ваш operator+=:

Obj& operator++()
{ operator +=(std::string("something")); return *this;
}

Кроме того, вы можете добавить неявный конструктор, который принимает const char*

Obj(const char* str)

licensed under cc by-sa 3.0 with attribution.