命名空间
变体
操作

C++ 命名要求: CopyConstructible

来自 cppreference.cn
 
 
C++ 命名要求
基本
CopyConstructible(可复制构造)
类型属性
全库范围




Container(容器)
容器元素
迭代器 (Iterator)
流 I/O
格式化器
(C++20)
随机数
并发
(C++11)
Ranges
多维视图
其他

 

指定该类型的实例可以从左值表达式进行复制构造。

目录

[编辑] 要求

类型 T 满足 CopyConstructible,如果:

给定

  • v,一个类型为 Tconst T左值表达式,或一个类型为 const T右值表达式,
  • u,一个任意标识符。

以下表达式必须有效并具有其指定的效果

表达式 后置条件
T u = v; u 的值等同于 v 的值。

v 的值未改变。

T(v) T(v) 的值等同于 v 的值。

v 的值未改变。

表达式 v.~T() 也必须有效,并且,对于左值 v,表达式 &v 的类型必须是 T*const T*,并且必须求值为 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++23 标准 (ISO/IEC 14882:2024)
  • 16.4.4.2 模板参数要求 [utility.arg.requirements]

[编辑] 另请参见

检查类型是否具有拷贝构造函数
(类模板) [编辑]
指定类型的对象可以被复制构造和移动构造
(概念) [编辑]