Вы можете использовать шаблон псевдонима, чтобы получить неполное имя типа, когда все, что у вас есть, это полное имя типа. Следующее должно работать
template<typename T> using alias = T;
ptr->~alias<std::remove_reference<decltype(*ptr)>::type>();
Обратите внимание, что если бы remove_reference
сработало, это все равно было бы опасно, потому что с помощью полного имени типа вы запретили бы вызов виртуального деструктора. При использовании шаблона псевдонима виртуальные деструкторы по-прежнему работают.
Обратите внимание, что GCC4.8, похоже, принимает
ptr->std::remove_reference<decltype(*ptr)>::type::~type();
Клэнг отвергает это. Я давно отказался от попыток понять, как работает поиск имени деструктора (если вы заглянете в исходники clang, то заметите, что разработчики clang тоже не следуют спецификации, потому что говорят, что здесь это не имеет смысла). Существуют DR, которые охватывают синтаксис вызова деструктора и то, как они искажаются. Поэтому я бы рекомендовал не использовать здесь сложный синтаксис.
person
Johannes Schaub - litb
schedule
26.06.2013