Namespaces
Variants

C++ named requirements: CopyConstructible

From cppreference.net
C++ named requirements

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

目录

要求

类型 T 满足 CopyConstructible

给定

  • v ,一个类型为 T const 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 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++23 标准 (ISO/IEC 14882:2024):
  • 16.4.4.2 模板参数要求 [utility.arg.requirements]

参见

检查类型是否拥有拷贝构造函数
(类模板)
指定该类型的对象可被拷贝构造和移动构造
(概念)