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

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

Разве не должна быть включена неявная конструкция для этого случая? (я передаю константную справочную строку и константную ссылку 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,
Спасибо!

-1

Решение

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

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

Obj(const char* str)

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

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

Другие решения

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

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

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

Obj(const char* str)
2

По вопросам рекламы ammmcru@yandex.ru