哪些类型是可简单构造的?

Dr.*_*Gut 9 c++ type-traits language-lawyer

我知道,许多类型(例如 POD 类型)都是默认可构造的。但是除了空参数列表之外,哪些类型可以从参数列表轻松构造?例如,什么类型可以简单地从 构造出来int?我想不出任何一个。

int以下类型在 C++17 中不能轻易构造(现场演示):

#include <type_traits>

struct X { int x; };
struct Y { Y(int) {} };
struct Z { Z(int) = delete; };

static_assert(std::is_trivially_constructible<X, int>::value == false);
static_assert(std::is_trivially_constructible<Y, int>::value == false);
static_assert(std::is_trivially_constructible<Z, int>::value == false);
Run Code Online (Sandbox Code Playgroud)

Dr.*_*Gut 3

简单构造Args...被定义为根据给定类型的值进行构造,该构造仅执行被认为是“琐碎”的操作。特别是语法T obj(std::declval<Args>()...)必须仅调用“琐碎”操作。

在 C++17 之前,唯一可能的简单构造操作是默认构造、复制构造和移动构造。因此,如果一组参数调用任何其他构造函数或在该构造过程中执行任何其他操作,则此类调用不会是微不足道的。因此,在 C++17 中,只有=std::is_trivially_constructible_v<T, int>才为真(可以简单地从自身复制)。Tintint

从 C++20 开始,实现P0960 “允许从带括号的值列表初始化聚合”std::is_trivially_constructible_v<X, int>为 true。请参阅现场演示。这是因为语法X obj(std::declval<int>())仅调用简单的操作,这满足了类型特征的要求。