【发布时间】:2019-12-09 15:52:15
【问题描述】:
我有这些课程:
#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 测试。
【问题讨论】:
-
GCC 8.3 - 好的,GCC 9.1/9.2 - 失败。
-
使用
C() {}也可以。 -
这对我来说很臭。在 Bugzilla 上没有立即明显的匹配。
-
有趣:
A中的static_assert失败,但如果您改为在A内默认构造一个T(例如,将成员T t;放在那里),一切正常.类型特征告诉您的内容与实际可能的内容之间存在不一致... -
@Nicolas 是的,但这是因为一些边缘情况,这些情况都不适用于这里(特别是,正如 cppreference 上的同一句话所说,
const int x;在没有初始化程序的情况下是无效的,纯粹是因为const以及内置类型的初始化行为和一些历史)