比方说,出于我自己的原因,我希望一个类有一个非静态引用成员。我认为这种类型应该很容易从使用它的大多数代码中优化出来。因此,我在单元测试中断言它的琐碎性。
Clang 和 GCC 同意该类是微不足道的,但 MSVC 不同意。根据标准,谁是对的,为什么?
#include <type_traits>
struct example {
int& r;
};
// Clang and GCC let this pass
// MSVC fires this assertion
static_assert(
std::is_trivial<example>::value,
"example is not trivial"
);
请您参考如下方法:
根据 C++17 [class]/6,要使一个类成为普通类,除其他要求外,它必须至少有一个未删除的默认构造函数。 example
类的默认构造函数被删除,因此 example
不是一个简单的类。
在 C++17 之前,情况不太清楚。平凡类需要有一个平凡的默认构造函数,并且不清楚删除的默认构造函数是否符合平凡的条件。理查德·史密斯在 CWG 1928 中提问默认和隐式删除的特殊成员函数是否微不足道。委员会的回应是:
CWG feels that the triviality of a deleted function should be irrelevant. Any cases in which the triviality of a deleted function is observable should be amended to remove that dependency.
随后,CWG 1496的决议在普通类的情况下解决了这个问题:删除的默认构造函数是否符合普通类不再重要,因为在 C++17 中,定义表明所有默认构造函数(如果有多个) 必须微不足道或已删除,并且至少有一个必须未删除。
似乎 GCC 和 Clang 可能一直在将删除的默认构造函数视为微不足道的,并且尚未使用“微不足道的类”的 C++17 定义进行更新。您应该提交错误报告。