Zuo*_* Hu 2 c++ language-lawyer
比方说,出于我自己的原因,我希望一个类有一个非静态引用成员。我认为这种类型应该很容易从使用它的大多数代码中优化。因此,我在单元测试中断言它的微不足道。
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"
);
Run Code Online (Sandbox Code Playgroud)
根据 C++17 [class]/6,要使类变得简单,除其他要求外,它必须至少有一个未删除的默认构造函数。在example类的默认构造函数被删除,所以example不是一个简单的类。
在 C++17 之前,情况不太清楚。一个平凡的类需要一个平凡的默认构造函数,并且不清楚删除的默认构造函数是否符合平凡的条件。Richard Smith 在CWG 1928 中询问默认和隐式删除的特殊成员函数是否微不足道。委员会的答复是:
CWG 认为删除函数的琐碎应该无关紧要。任何可以观察到已删除函数的琐碎性的情况都应进行修改以消除该依赖性。
随后,CWG 1496的决议在平凡类的情况下解决了这个问题:删除的默认构造函数是否符合平凡不再重要,因为在 C++17 中,定义表示所有默认构造函数(如果有多个) 必须是微不足道的或已删除,并且至少有一个必须是未删除的。
似乎 GCC 和 Clang 可能已经将删除的默认构造函数视为微不足道的,并且尚未使用 C++17 对“微不足道的类”的定义进行更新。您应该提交错误报告。
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |