假设,出于我自己的原因,我希望一个类有一个非静态引用成员。我认为这种类型应该很容易从使用它的大多数代码中进行优化。因此,我在单元测试中断言其琐碎性。
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 http://wg21.link/cwg1928默认和隐式删除的特殊成员函数是否微不足道。委员会的答复是:
CWG 认为删除的函数的琐碎性应该是无关紧要的。任何可以观察到已删除函数的琐碎性的情况都应该进行修改以消除这种依赖性。
随后,决议CWG 1496 http://wg21.link/cwg1496在平凡类的情况下解决了这个问题:删除的默认构造函数是否符合平凡不再重要,因为在 C++17 中,定义表示all默认构造函数(如果有多个)必须是要么微不足道,要么被删除并且至少有一个必须未被删除。
看来 GCC 和 Clang 可能一直认为已删除的默认构造函数是微不足道的,并且尚未使用“微不足道的类”的 C++17 定义进行更新。您应该提交错误报告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)