C++ named requirements: CopyConstructible
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
指定该类型的实例可以从 左值表达式 进行拷贝构造。
目录 |
要求
类型
T
满足
CopyConstructible
若
-
类型
T满足 MoveConstructible 要求,且
给定
以下表达式必须有效并具有其指定效果:
| 表达式 | 后置条件 |
|---|---|
| T u = v ; |
u
的值等价于
v
的值。
v 的值保持不变。 |
| T ( v ) |
T
(
v
)
的值等价于
v
的值。
v 的值保持不变。 |
|
表达式
v.~T
(
)
同样必须有效,且对于左值
v
,表达式
&
v
必须具有类型
|
(C++11 前) |
注释
在C++11之前,重载了 operator & 的类不符合 CopyConstructible 要求,因此无法在 标准库容器 中使用。这是C++98的设计决策(而非缺陷,参见 LWG issue 390 )。
自 C++11 起,标准库在需要获取对象地址时均使用 std::addressof 。
| 扩展内容 |
|---|
|
作为 CopyConstructible 类意味着满足 std::is_copy_constructible ,但反之不成立,因为 std::is_copy_constructible 仅检查是否能够使用正确参数调用构造函数,而不检查例如 MoveConstructible 要求。
运行此代码
#include <type_traits> #include <utility> struct S { S() = default; S(S&&) = delete; S(const S&) = default; }; static_assert(std::is_copy_constructible_v<S>); int main() { S s1; // 类`S`不满足MoveConstructible要求, // 因此不满足CopyConstructible要求 [[maybe_unused]] S s2{std::move(s1)}; // 非良构,使用了已删除的函数 } |
参考文献
| 扩展内容 |
|---|
|
参见
|
(C++11)
(C++11)
(C++11)
|
检查类型是否拥有拷贝构造函数
(类模板) |
|
(C++20)
|
指定该类型的对象可被拷贝构造和移动构造
(概念) |