我们有以下方法来测试我们的结构是否是POD.它总是返回true:
bool podTest() {
struct podTest {
int count;
int x[];
};
return std::is_pod<podTest>::value; //Always returns true
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在我们进行一次更改并删除复制构造函数:
bool podTest() {
struct podTest {
podTest(const podTest&) = delete;
int count;
int x[];
};
return std::is_pod<podTest>::value; //Always returns false
}
Run Code Online (Sandbox Code Playgroud)
这总是返回false.在阅读了is_pod我的定义后,我仍在努力了解它违反了什么要求.我错过了什么?
这是使用gcc 6.1在godbolt上编译的 -std=c++14
使用私有拷贝construcor和赋值运算符boost::noncopyable或C++ 11 delete关键字很容易创建不可复制的类:
class MyClass {
private:
int i;
public:
MyClass(const MyClass& src) = delete;
MyClass& operator=(const MyClass& rhs) = delete;
int getI() {
return i;
}
MyClass(int _i) : i(_i){}
};
int main() {
MyClass a(1), b(2);
a = b; // COMPILATION ERROR
}
Run Code Online (Sandbox Code Playgroud)
但是,这并不能防止obiect被深度复制为一个字节包:
int main() {
MyClass a(1), b(2);
std::memcpy(&a, &b, sizeof(MyClass));
std::cout << a.getI() << std::endl; // 2
}
Run Code Online (Sandbox Code Playgroud)
即使试图通过声明operator&私有来阻止它,仍然可以使用地址的成语来实现复制:
int main() {
MyClass a(1), b(2);
std::memcpy(std::addressof(a), std::addressof(b), sizeof(MyClass));
std::cout << …Run Code Online (Sandbox Code Playgroud) Folly库要求std::atomic<hazptr_obj*>应该是一个简单的类型.这适用于gcc和clang,但即使对于Visual C++也是如此std::atomic<int>.为什么要std::is_trivial回来false?
#include <type_traits>
#include <atomic>
static_assert(
std::is_trivial<std::atomic<int>>::value,
"std::atomic<int> not trivial");
Run Code Online (Sandbox Code Playgroud)