Незаконное использование неопределенного типаC++

Программы на 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 больше не будет считаться агрегатным типом.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»