У меня были подобные проблемы при использовании «java» в начале имени пакета, например. java.jem.pc
Проверьте вывод консоли, я получаю: Исключение в потоке «main» java.lang.SecurityException: Запрещено имя пакета: java.jem.pc
blockquote>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]
:Класс считается полностью определенным типом объекта (или полным типом) при закрытии
BLOCKQUOTE>}
] спецификатора класса . В пределах класса спецификация члена , класс рассматривается как завершенный в теле функции , аргументах по умолчанию, спецификаторах noexcept и инициализаторах членов по умолчанию (включая такие вещи во вложенных классах). В противном случае он считается неполным в пределах своей спецификации члена класса.