У меня есть этот простой код:C++ компилятор может молча принять неправильное преобразование и ввести непредсказуемые ошибки
class A {
public:
int m;
};
class B : public A {
public:
B(const B& b) { /*...*/ }
B(const A& a) { /*...*/ }
int n;
};
const A& function()
{
static A a;
return a;
}
int main()
{
const B& a = function();
const int x = a.n; // !!!!! Error: probably reads some random mess
/* ... */
B b2 = function();
/* ... */
return 0;
}
В этом коде я продемонстрировать, что может случиться, когда вы ошибочно писать const B& a = function()
вместо const A& a = function()
. И компилятор не поймает эту ошибку! Чтобы уловить эту ошибку во время компиляции, конструктор B(const A& a)
должен быть explicit
. Но маркировка конструктор explicit
отключает способность делать B b2 = function();
- это должно быть написано уродливее: B b2(function());
Вопрос: Существует ли какой-нибудь способ, чтобы поймать этот тип ошибки во время компиляции, сохраняя при этом возможность написать это?
B b2 = function();
EDIT: Как заявил @ditskowitch и @ N.m. - Я полагаю, что ошибка - это не ошибка. Для этого явный конструктор не нужен. Это может быть teoreticaly проблема только в том случае в зависимости от кода ожидает, что ссылка, возвращенное функцией() баллов в какой-то адрес, как показано на @Rory Yorke
Позвольте мне лучше понять, чего вы хотите. Вы хотите, чтобы 'B & a = function()' выполнялся неудачно, но 'B b = function()' преуспел, правильно? –
@ н.м .: да, вы правы. – user3123061
Это вряд ли возможно. –