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 问题 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) |
指定类型的对象可以被复制构造和移动构造 (概念) |