相关疑难解决方法(0)

为什么具有已删除的复制构造函数的结构不是POD类型?

我们有以下方法来测试我们的结构是否是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

c++ struct copy-constructor c++14

9
推荐指数
1
解决办法
875
查看次数

我可以阻止std :: memcpy复制对象吗?

使用私有拷贝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)

c++ memory c++11

8
推荐指数
1
解决办法
453
查看次数

为什么std :: atomic不仅仅是Visual C++中的普通类型?

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)

c++ visual-c++ c++11

7
推荐指数
1
解决办法
451
查看次数

标签 统计

c++ ×3

c++11 ×2

c++14 ×1

copy-constructor ×1

memory ×1

struct ×1

visual-c++ ×1