如果 std::is_trivial_v<T> 为真,则 std::is_standard_layout_v<T> 是不是始终为真?
Posted
技术标签:
【中文标题】如果 std::is_trivial_v<T> 为真,则 std::is_standard_layout_v<T> 是不是始终为真?【英文标题】:Is std::is_standard_layout_v<T> always true if std::is_trivial_v<T> is true?如果 std::is_trivial_v<T> 为真,则 std::is_standard_layout_v<T> 是否始终为真? 【发布时间】:2020-06-10 08:52:38 【问题描述】:template<typename T>
void f()
if constexpr (std::is_trivial_v<T>)
// Does the following line never fail?
static_assert(std::is_standard_layout_v<T>);
如果std::is_trivial_v<T>
为真,std::is_standard_layout_v<T>
是否始终为真?
如果没有,有反例吗?
【问题讨论】:
您可以在文档中查看这些概念的要求:TrivialType、StandardLayoutType。 【参考方案1】:#include <type_traits>
class type
public: int x;
private: int y;
;
static_assert(std::is_trivial_v< type >);
// not standard layout because different access level of x and y
static_assert(not std::is_standard_layout_v< type >);
https://godbolt.org/z/xz3xLy
【讨论】:
以上是关于如果 std::is_trivial_v<T> 为真,则 std::is_standard_layout_v<T> 是不是始终为真?的主要内容,如果未能解决你的问题,请参考以下文章
如果 T 具有显式构造函数,则无法使用 emplace new 将元素添加到 container<T>
如果 A<B == true 如果 A 和 B 是 Doubles。我将位复制到两个 uint64_t 将 A<B 仍然为真
如果“struct”和“class”是同一个东西,那么为啥在 template<class T> 中只使用“class”而不是“struct”?