Я пытаюсь выяснить, почему компилятор не делает вывод, что он должен использовать строковый конструктор 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,
Спасибо!
Преобразование из строкового литерала "something"
в Obj
потребует два определяемые пользователем преобразования: одно из строкового литерала в std::string
и один из std::string
в Obj
используя ваш конструктор. Последовательности неявного преобразования ограничены только одним определенным пользователем преобразованием.
Лучший способ решить эту проблему — добавить еще один конструктор, который принимает строку C,
Obj(const char* str)
Если вы не хотите добавлять такой конструктор и хотите выполнить это преобразование только один раз, вы можете:
operator+=(std::string("something"))
(выполнить первое преобразование явно)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)