Уточнить требования к аргументам стандартных type traits

Andrey
Andrey

Рассмотрим такой пример (https://gcc.godbolt.org/z/b_gtT7):

struct A {
    struct B {
        int i = 0 /* <-- @1 */;
    };

    struct C {
        C(int = 0 /* <-- @2 */);
    };

    static inline B b { }; // #1
    static inline C c { }; // #2

    static_assert(is_default_constructible_v<B>); // #3
    static_assert(is_default_constructible_v<C>); // #4
};

// #5

В точках #1 и #2 ошибка компиляции, потому что парсинг @1 и @2 откладывается до конца тела класса А (так как в точках @1 и @2 можно ссылаться на имена определенные в А ниже определения B). Соответственно static_assert-ы #3 и #4 падают, при этом очевидно, что is_default_constructible_v для B и С должны вычисляться в true в точке #5.

 

4
рейтинг
Нет комментариев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения