Является ли использование в неиспользуемом инициализаторе члена по умолчанию все еще использованием odr?

Является ли использование в инициализаторе элемента по умолчанию по-прежнему odr-использованием, даже если инициализатор члена по умолчанию не используется каким-либо конструктором?

Например, является ли эта программа неправильной, потому что g<A>используется odr и, следовательно, его определение неявно инстанцируется?

      template<typename T>
void g() { sizeof(T); }

struct A;

struct B {
    B() : i{} {};

    int i = (&g<A>, 0);
};

int main() { }

MSVC считает, что нет. Clang, GCC и ICC считают, что да. https://godbolt.org/z/zrr9oEdfe

1 ответ

Как указано в комментариях, g<A>Odr-используется. Однако для него существует доступное определение, поэтому здесь нет недиагностируемого нарушения; MSVC неправильно принимает это. (Это верно даже без объявления конструктора; неявно объявленный B::B()никогда не определяется, но инициализатор члена по умолчанию по-прежнему используется odr, как здесь.)

Другие вопросы по тегам