Почему мой класс C ++ может быть неявно преобразован в одном случае, но не в другом?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему мой класс C ++ может быть неявно преобразован в одном случае, но не в другом?

Сообщение Anonymous »

Я получаю ошибку компилятора о конверсии типа, которая должна быть законной, на мои глаза. Допустим, у меня есть домашний класс строк, конвертируемый из и к Char*.

Код: Выделить всё

class custom_string
{
public:
custom_string(const char* str) : _str{str} {}
operator const char*() const { return _str; }

private:
const char* _str;
};
out в дикой природе, я хочу использовать этот пользовательский класс взаимозаменяемо со std :: string несколькими способами:

Код: Выделить всё

struct pod_t
{
std::string str;
int other_data;
};

void test()
{
custom_string cstr("Hello");

std::set strings;
strings.emplace(cstr);
pod_t pod {cstr, 42}; // C2440: 'initializing': cannot convert from 'custom_string' to 'std::string'
}
< /code>
Почему последняя строка приводит к ошибке компилятора (я использую MSVC с флага /std: c ++ 20 < /code>)? Если компилятор может выяснить путь от custom_string 
до std :: string в случае функции Emplace (предположительно, он использует char* operator), почему он не может сделать то же самое, когда я пытаюсь инициализировать структуру?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... ot-another
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»