在未使用的默认成员初始值设定项中使用仍然是 ODR 使用吗?

Is use in an unused default member initializer still an odr-use?

在默认成员初始值设定项中使用是否仍然是 odr-use,即使默认成员初始值设定项未被任何构造函数使用?

例如,这个程序是否格式错误,因为 g<A> 是 odr-used,因此它的定义被隐式实例化?

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

如评论中的g<A>为odr-used。但是, 可用的定义,因此这里没有 non-diagnosable 违规; MSVC 错误 接受它。 (即使没有构造函数声明也是如此;隐式声明的 B::B() 从未定义,但默认成员初始值设定项仍然是 odr-use 就像这里一样。)