为什么CopyConstructible定义提到"const T的rvalue表达式"?

cod*_*707 3 c++ const copy-constructor language-lawyer

以下是cppreference的定义:

[ https://en.cppreference.com/w/cpp/named_req/CopyConstructible][1]

要求:类型T满足CopyConstructible if

类型T满足MoveConstructible和Given

v,类型为T或const T的左值表达式或类型为const T u的rvalue表达式,任意标识符以下表达式必须有效且具有指定的效果

表达式后置条件T u = v; u的值等于v的值.v的值不变

T(v)T(v)的值等于v的值.v的值不变.

我的问题是以下几行:

v,类型为T或const T的左值表达式或类型为const T的右值表达式

我不理解这个"const T型的rvalue表达式"的一部分?为什么这个"类型为const T的rvalue表达式"在CopyConstructible的定义中是什么?有人可以用例子解释一下吗?MoveConstructible的定义(这是CopyConstructible的先决条件)已经包含了这个要求,不是吗?

Cal*_*eth 5

不,MoveConstructible的定义只关心非const rvalue表达式,因为你不能从const移动.

拷贝构造扩展了覆盖剩余的可能性T u = v;T(v);.

请注意,只有复制类型仍然可以满足MoveConstructible,如果它rv保持不变,因为"新值rv未指定".

举个例子

struct Foo {
    void Bar() { /* modify Foo somehow */ }
};

const Foo createFoo() { return {}; }

Foo foo = createFoo(); // Must copy, as the return value is const
Run Code Online (Sandbox Code Playgroud)

这种构造发生在前C++ 11代码中,作者希望禁止构造,createFoo().Bar();因为修改临时代码是错误的Foo.