Я пытаюсь поддерживать неявное приведение литеральных значений в системе типов. Эти неявные приведения предназначены и идеальны (см. Примечание 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. Значения типов, которые неявно преобразуются, являются одинаковыми значениями. тип только означает, что значение прошло предварительное условие, сохраняет свое условие с помощью операций и распространяет это условие с помощью операций над аналогичными типами. Неявное приведение разрешено для типов к другим типам с более слабыми предварительными условиями.