在未使用的默认成员初始值设定项中使用仍然是 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 就像这里一样。)
在默认成员初始值设定项中使用是否仍然是 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 就像这里一样。)