C++ 命名要求: CopyConstructible
来自 cppreference.com
指定该类型的实例可以从 左值表达式 复制构造。
内容 |
[编辑] 要求
如果类型 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 问题 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) |
指定类型的对象可以复制构造和移动构造 (概念) |