我有那些课:
#include <type_traits>
template <typename T>
class A {
public:
static_assert(std::is_default_constructible_v<T>);
};
struct B {
struct C {
int i = 0;
};
A<C> a_m;
};
int main() {
A<B::C> a;
}
编译时a_m不是默认可构造的,而是a可以构造的。
更改C为:
struct C {
int i;
};
一切安好。
使用Clang 9.0.0测试。
3
GCC 8.3-确定,GCC 9.1 / 9.2-失败。
—
2015年
有了
—
2015年
C() {}它也可以。
这对我来说有点臭。在Bugzilla上没有立即明显的匹配。
—
Lightness Races in Orbit
有趣的是:
—
sebrockm
static_assertin A失败了,但是如果您改为默认构造一个T内部对象A(例如,在其中放置一个成员T t;),则一切正常。类型特征告诉您的内容与实际可能的内容之间存在矛盾……
@Nicolas True,但这是由于某些极端情况,在这里没有一个适用(特别是,如cppreference上的同一句话所述,
—
轻轨比赛(
const int x;没有初始化程序是无效的,这完全是由于const内置类型的和初始化行为,以及一些历史)