c++ - std::trivially_copyable_v 和 std::is_pod_v 之间有什么区别(std::is_standard_layout && std::is_trivial_v)

标签 c++ c++17 typetraits

我正在查看这两种类型特征的文档,但不确定有什么区别。我不是语言律师,但据我所知,它们都适用于“memcpy-able”类型。

它们可以互换使用吗?

最佳答案

不,这些术语不能互换使用。这两个术语都表示可以与 memcpy 一起使用的类型,任何属于 POD 的东西都可以简单复制,但可以简单复制的东西不一定是 POD。

在这个简单的示例中,您可以看到 foo 是 POD(随后可简单复制),而 bar 不是 POD,但可简单复制:

#include <iostream>

struct foo
{
    int n;
};

struct bar
{
    int n = 4;
};

int main()
{
    std::cout << std::boolalpha << std::is_pod<foo>() << "\n";
    std::cout << std::boolalpha << std::is_trivially_copyable<foo>() << "\n";
    std::cout << std::boolalpha << std::is_pod<bar>() << "\n";
    std::cout << std::boolalpha << std::is_trivially_copyable<bar>() << "\n";
}

上面的输出是:

true
true
false
true

foobar 都可以安全地与memcpy, whose documentation states 一起使用:

If the objects are [...] not TriviallyCopyable, the behavior of memcpy is not specified and may be undefined.

关于c++ - std::trivially_copyable_v 和 std::is_pod_v 之间有什么区别(std::is_standard_layout && std::is_trivial_v),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67798506/

相关文章:

c++ - 将任意梯度旋转 90 度的算法

c++ - 为什么提议的 `std::shared_ptr::operator[]` 以 `std::ptrdiff_t` 作为参数

c++ - std::hardware_destructive_interference_size 的可靠性

c++ - 从 C++ 中的类型列表获取类型索引

c++:是否有类似 "boost/std typetraits conditional"的东西在编译时生成一个值(不是类型)?

c++ - 编译器对编译时分支有什么作用?

c++ - 为什么 C++ 中的类型别名在其语法中使用 'using' 而不是 'typedef'?

c++ - 函数参数的 Visual Studio 缩进

c++ - 使用省略号的类型安全

c++ - 为什么推导 F 时 std::is_function<F> 返回 false_type?