Я задаю этот вопрос после проблемы, которую я поднял здесь.
Дело довольно простое. Предположим, у вас есть два класса такого типа:
template < class Derived >
class Base {
...
operator const Derived&() const {
return static_cast< const Derived& >(*this);
}
...
};
class Specialization : public Base {
...
};
Затем предположим, что у вас есть преобразование типа, подобное этому:
template < class T >
functionCall( const Base& param) {
const T & val(param);
...
}
Вопрос в следующем: каким должно быть стандартное поведение этого преобразования?
Должен ли он быть таким же, как const T & val(static_cast
или должен рекурсивно повторяться до переполнения стека? Обратите внимание, что первое поведение компилируется с помощью GNU g++
, а второе — с помощью Intel icpc
.
Я уже пытался заглянуть в стандарт (раздел 5.9 о static_cast и раздел 12.3 о преобразованиях), но из-за отсутствия опыта не смог найти ответ.
Заранее большое спасибо всем, кто найдет время помочь мне с этим.