作者:手机用户2502930741 | 来源:互联网 | 2022-12-10 12:38
以下是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的先决条件)已经包含了这个要求,不是吗?
1> Caleth..:
不,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
这种构造发生在前C++ 11代码中,作者希望禁止构造,createFoo().Bar();
因为修改临时代码是错误的Foo
.