move_constructible我从cppreference得到了以下 C++ 概念的实现
template<typename _Tp>
concept move_constructible =
constructible_from<_Tp, _Tp> &&
convertible_to<_Tp, _Tp>;
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这有效。我认为任何类型都可以转换为自身,因此第二个要求是毫无意义的(上帝,我一定是在某些方面错了)。另外,对于第一个要求,我希望constructible_from<_Tp, _Tp&&>检查类型是否可以从 rvalue-ref 构造(因此移动)。
请解释一下这个实现是如何工作的。
我发现了一个我无法解释的有趣行为。我编写了这个非常简单的程序,它在没有明显原因的情况下出现了段错误。请问,有人可以解释一下这里发生了什么吗?
我已经测试过,当发生以下任何一种情况时,段错误就会消失:
_start为main、删除了 extern "C" 等)以下是该程序唯一的代码文件,我们称之为main.cpp.
构建它clang main.cpp -nostdlib:
struct A
{
A () = default;
A (const A &) = default;
// A (A &) = default;
char * a = nullptr;
unsigned long long b;
};
struct ConvertibleToA
{
ConvertibleToA() = default; // default constructor
operator A() { return m_a; } // conversion to type A
A m_a;
};
extern …Run Code Online (Sandbox Code Playgroud)