小编aka*_*ora的帖子

如果我声明解构函数但与默认解构函数完全相同,编译器是否仍会生成默认移动构造函数?

在这种情况下,我对默认函数生成的规则感到困惑:

对于最简单的类:

B 类{};

它将自动生成移动构造函数。

然而,如果为了

B 类{ public: ~B(){} }

我想它应该和默认的解构函数一样,这时候我会有一个默认的移动构造函数吗?我怎样才能检查它?

class A{
public:
    A() {}
    A(const A& lv) {cout << "a copy ctor." << endl;}
    A(A&& rv) {cout << "a move ctor." << endl;}
};

class B{
public:
    //~B(){}
private:
    A a;
};

int main()
{
    B b;
    B b2(std::move(b));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我尝试了这个方法,似乎答案是否定的,但我不确定。

c++ constructor class

2
推荐指数
1
解决办法
117
查看次数

Placement new 的底层实现是怎样的?

T *p = ::operator new(sizeof(T));
new (p) T;
Run Code Online (Sandbox Code Playgroud)

我想知道该语法是如何工作的,因为放置 new 被声明为:

void* operator new(std::size_t, void*)
Run Code Online (Sandbox Code Playgroud)

第二个参数void*似乎指向对象的存储,那么C++如何将 与 联系new (p) T起来void*

在 gcc libsupc++ 中,实现很简单:

// Default placement versions of operator new.
_GLIBCXX_NODISCARD inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }

_GLIBCXX_NODISCARD inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }
Run Code Online (Sandbox Code Playgroud)

编译器是否负责将语法转换new(*T) T为布局的调用operator new

c++ gcc placement-new

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

标签 统计

c++ ×2

class ×1

constructor ×1

gcc ×1

placement-new ×1