Незаконное использование неопределенного типа ⇐ C++
-
Гость
Незаконное использование неопределенного типа
Учитывая приведенный ниже пример кода, является ли decltype(h{}.t()); допустимым выражением? Какое конкретное правило стандарта C++20 разрешает или запрещает это?
struct d; struct h { static auto t() -> d; }; используя a = decltype(h::t()); // все ок используя b = decltype(decltype(h{})::t()); // все ок используя c = decltype(h{}.t()); // clang ок, gcc ок, msvc нет Живой пример
Сообщение об ошибке, выдаваемое MSVC:
(6): ошибка C2027: использование неопределенного типа 'd' (1): примечание: см. объявление «d» Наткнувшись на еще одну ошибку в MSVC, я нашел способ обойти отклонения в поведении MSVC. Просто предоставляя пользовательский конструктор по умолчанию для типа h, MSVC больше не жалуется на то, что d не определен.
struct d; структура ч { статический авто t() -> d; ч() = по умолчанию; }; используя c = decltype(h{}.t()); // все ок Однако проблема по-прежнему сохраняется при пропуске использования конструктора h, например, при использовании std::declval например (как в: decltype(std::declval().t());). Кроме того, имейте в виду, что предоставление определяемого пользователем конструктора по умолчанию, даже если он задан по умолчанию, приведет к тому, что h больше не будет считаться агрегатным типом.
Учитывая приведенный ниже пример кода, является ли decltype(h{}.t()); допустимым выражением? Какое конкретное правило стандарта C++20 разрешает или запрещает это?
struct d; struct h { static auto t() -> d; }; используя a = decltype(h::t()); // все ок используя b = decltype(decltype(h{})::t()); // все ок используя c = decltype(h{}.t()); // clang ок, gcc ок, msvc нет Живой пример
Сообщение об ошибке, выдаваемое MSVC:
(6): ошибка C2027: использование неопределенного типа 'd' (1): примечание: см. объявление «d» Наткнувшись на еще одну ошибку в MSVC, я нашел способ обойти отклонения в поведении MSVC. Просто предоставляя пользовательский конструктор по умолчанию для типа h, MSVC больше не жалуется на то, что d не определен.
struct d; структура ч { статический авто t() -> d; ч() = по умолчанию; }; используя c = decltype(h{}.t()); // все ок Однако проблема по-прежнему сохраняется при пропуске использования конструктора h, например, при использовании std::declval например (как в: decltype(std::declval().t());). Кроме того, имейте в виду, что предоставление определяемого пользователем конструктора по умолчанию, даже если он задан по умолчанию, приведет к тому, что h больше не будет считаться агрегатным типом.
Мобильная версия