Правильно ли получен тип decltype выведенной функции-члена внутри конечного типа возврата другой функции-члена?

У меня были подобные проблемы при использовании «java» в начале имени пакета, например. java.jem.pc

Проверьте вывод консоли, я получаю: Исключение в потоке «main» java.lang.SecurityException: Запрещено имя пакета: java.jem.pc

9
задан Ayrosa 23 February 2019 в 12:38
поделиться

1 ответ

struct Test
{
    auto foo() { /*1*/ }                       
    auto bar() -> decltype(foo()) {}
};

На маркере 1 имя Test::bar находится в области видимости вместе со всеми другими членами struct Test. Поэтому компилятор не может анализировать тело из foo() до тех пор, пока класс не будет завершен.

Затем мы имеем частичное упорядочение:

  • Разобрать тело из Test::foo() перед выводом его возвращаемого типа
  • Завершить класс Test перед анализом тела из Test::foo() [1117 ]
  • Анализ завершающего типа возвращаемого значения Test::bar() перед завершением класса Test (из вопроса, который вы указали, не является обманом)

и по транзитивности тип возвращаемого значения Test::bar() должен проанализировать, не выполняя вычет типа возврата для Test::foo().


Так как была запрошена стандартная цитата, здесь она из [class.mem]:

Класс считается полностью определенным типом объекта (или полным типом) при закрытии } ] спецификатора класса . В пределах класса спецификация члена , класс рассматривается как завершенный в теле функции , аргументах по умолчанию, спецификаторах noexcept и инициализаторах членов по умолчанию (включая такие вещи во вложенных классах). В противном случае он считается неполным в пределах своей спецификации члена класса.

0
ответ дан Ben Voigt 23 February 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: