Неявные ограничения приведения - PullRequest
1 голос
/ 04 октября 2019

Я пытаюсь поддерживать неявное приведение литеральных значений в системе типов. Эти неявные приведения предназначены и идеальны (см. Примечание 1). Я знаю, что C ++ может выполнять несколько неявных приведений в выражении. Вторая строка main ниже не работает.

class A {
public:
    A(const std::string&);
};

class B {
public:
    B(const A&);
};

int main(void)
{
    A("example");  // this works
    B("example");  // this does not work
}

Если я добавлю конструктор const char* в A, вторая строка будет работать ...

class A {
public:
    A(const char*);
    A(const std::string&);
};

class B {
public:
    B(const A&);
};

int main(void)
{
    A("example");  // this works
    B("example");  // now it works
}

Почемупервая реализация не работает? Во второй строке можно построить const char* в std::string, затем в A и, наконец, B.

Примечание 1. Значения типов, которые неявно преобразуются, являются одинаковыми значениями. тип только означает, что значение прошло предварительное условие, сохраняет свое условие с помощью операций и распространяет это условие с помощью операций над аналогичными типами. Неявное приведение разрешено для типов к другим типам с более слабыми предварительными условиями.

Ответы [ 2 ]

4 голосов
/ 04 октября 2019

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

Последовательность неявных преобразований состоит из следующего в следующем порядке:

1) ноль или одна стандартная последовательность преобразования;

2) ноль или одно пользовательское преобразование;

3) ноль или одна стандартная последовательность преобразования.

Для вашего первого фрагмента кода, заданного B("example");, требуется два пользовательских преобразования;const char* до std::string и std::string до A.

В качестве обходного пути вы можете добавить другой конструктор преобразования, как вы пытались, или добавить явное преобразование для конструкции B, например

B(A("example"));
0 голосов
/ 04 октября 2019

Чтобы реализовать неявное приведение, вы должны поместить тип данных в круглые скобки, а затем переменную (int)(var)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...