Правильный ли следующий код или он приводит к неопределенному поведению из-за висящей ссылки и почему именно он правильный:
class A {};
class B : public A {};
B& f(A& a) {
// Dangling reference here?
return static_cast<B&>(a);
}
int main()
{
A a;
B& b = f(a);
}
Вы не создаете временный объект, поэтому здесь ничего не болтается
Оба a относятся к одному и тому же объекту, время жизни которого заканчивается после выхода из main. b относится к подобъекту a, время жизни которого также заканчивается при выходе из main. Так что никаких болтающихся ссылок.
Я проверил документацию static_cast. Что означает подавленный именно в этом контексте?





Висячая ссылка - это ссылка на объект, который больше не существует. В вашем примере кода проблем нет, поскольку A существует в той же области, что и B, и поэтому ссылка всегда действительна.
Теперь возьмем этот измененный пример, в котором удаляем объект A после создания ссылки на него. На самом деле это висячая ссылка, которая приводит к неопределенному поведению после удаления объекта A.
#include <iostream>
class A {
public:
int m;
};
class B : public A {};
B& f(A& a) {
return static_cast<B&>(a);
}
int main()
{
A *a = new A();
a->m = 42;
B& b = f(*a);
std::cout << b.m << std::endl; // Valid
delete a; // Dangling reference created here
std::cout << b.m << std::endl; // Undefined behavior
}
Можете ли вы предоставить какие-то источники?
Это неопределенное поведение, но не из-за висящей ссылки. Акт преобразования объекта с помощью static_cast из родительского класса в дочерний класс, когда на самом деле этот дочерний элемент не является неопределенным поведением:
B& b = f(a); // Casts `A` type to `B` incorrectly
См. Соответствующее стандартное предложение здесь.
@Incomputable Я перепроверил и думаю, что ваш "возможный дубликат" был правильным.