Skip to main content
 首页 » 编程设计

c++之引用类成员琐碎

2024年09月03日26kevingrace

比方说,出于我自己的原因,我希望一个类有一个非静态引用成员。我认为这种类型应该很容易从使用它的大多数代码中优化出来。因此,我在单元测试中断言它的琐碎性。

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 定义进行更新。您应该提交错误报告。