Является ли использование в неиспользуемом инициализаторе члена по умолчанию все еще использованием 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, как здесь.)