C++ 引用类成员平凡性

C++ 引用类成员平凡性,c++,language-lawyer,C++,Language Lawyer,比如说,出于我自己的原因,我希望一个类有一个非静态引用成员。我认为这种类型应该很容易在大多数使用它的代码中进行优化。因此,我在单元测试中断言它的平凡性 Clang和GCC都认为这个类很琐碎,但MSVC不同意。根据标准,谁是对的,为什么 #包括 结构示例{ 国际与r; }; //叮当声和GCC让这一切过去 //MSVC触发了这个断言 静态断言( std::is_平凡::值, “例子并非微不足道” ); 根据C++17[class]/6,对于一个简单的类,除其他要求外,它必须至少有一个未删除的默认构

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

Clang和GCC都认为这个类很琐碎,但MSVC不同意。根据标准,谁是对的,为什么

#包括
结构示例{
国际与r;
};
//叮当声和GCC让这一切过去
//MSVC触发了这个断言
静态断言(
std::is_平凡::值,
“例子并非微不足道”
);

根据C++17[class]/6,对于一个简单的类,除其他要求外,它必须至少有一个未删除的默认构造函数。
example
类的默认构造函数被删除,因此
example
不是一个简单的类

在C++17之前,情况就不那么清楚了。普通类需要有一个普通的默认构造函数,并且不清楚删除的默认构造函数是否符合普通的条件。Richard Smith在一篇文章中问,默认并隐式删除的特殊成员函数是否微不足道。委员会的答复是:

CWG认为被删除函数的琐碎性应该是无关紧要的。任何情况下,删除的函数的琐碎性是可观察的,都应该进行修改,以消除这种依赖性

随后,对平凡类的解决解决了这个问题:已删除的默认构造函数是否符合平凡的条件不再重要,因为在C++17中,定义说所有默认构造函数(如果有多个)必须是平凡的或已删除的,并且必须至少有一个未删除


看起来GCC和Clang可能一直认为删除的默认构造函数是微不足道的,并且没有用C++17定义的“微不足道的类”进行更新。您应该提交错误报告。

我认为,出于技术原因,出于您的目的(希望确保某些优化是可能的),询问类是否“微不足道”是错误的。另外,你可以有一个有100个int成员的类,它仍然是“微不足道的”,尽管复制起来有点贵。好吧,这正是我解决语言律师问题的途径,我很好奇律师的回答,我是否在我的生活中再写一次。GCC已经有一个bug报告和叮当声。怎么会有多个默认构造函数?我应该问一个新问题而不是在评论中问吗?@zudianhu是的,请问一个新问题。在这里问