在这种情况下,我对默认函数生成的规则感到困惑:
对于最简单的类:
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)
我尝试了这个方法,似乎答案是否定的,但我不确定。
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?