Оператор преобразования реализован с помощью static_cast

Я задаю этот вопрос после проблемы, которую я поднял здесь.

Дело довольно простое. Предположим, у вас есть два класса такого типа:

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 (param)) или должен рекурсивно повторяться до переполнения стека? Обратите внимание, что первое поведение компилируется с помощью GNU g++, а второе — с помощью Intel icpc.

Я уже пытался заглянуть в стандарт (раздел 5.9 о static_cast и раздел 12.3 о преобразованиях), но из-за отсутствия опыта не смог найти ответ.

Заранее большое спасибо всем, кто найдет время помочь мне с этим.

7
задан Community 23 May 2017 в 12:11
поделиться