如果 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&lt;T&gt; 为真,std::is_standard_layout_v&lt;T&gt; 是否始终为真?

    如果没有,有反例吗?

【问题讨论】:

您可以在文档中查看这些概念的要求: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>

C#泛型列表<T>如何获取T的类型? [复制]

如果 A<B == true 如果 A 和 B 是 Doubles。我将位复制到两个 uint64_t 将 A<B 仍然为真

收益回报与回报 IEnumerable<T>

POJ-3087

如果“struct”和“class”是同一个东西,那么为啥在 template<class T> 中只使用“class”而不是“struct”?