C++ 命名要求: CopyConstructible
来自 cppreference.cn
指定类型的实例可以从左值表达式复制构造。
目录 |
[编辑] 要求
如果类型 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; // Class `S` doesn't satisfy MoveConstructible requirement, // hence doesn't satisfy CopyConstructible requirement [[maybe_unused]] S s2{std::move(s1)}; // ill-formed, use of deleted function } |
[编辑] 参考
扩展内容 |
---|
|
[编辑] 参见
(C++11)(C++11)(C++11) |
检查类型是否具有复制构造函数 (类模板) |
(C++20) |
指定类型的对象可以复制构造和移动构造 (概念) |