使用术语“direct-non-list-initializes”而不是“copy constructs”的可选复制构造函数

Copy constructor of optional using term "direct-non-list-initializes" instead of "copy constructs"

提问人:cbhattac 提问时间:10/1/2023 更新时间:10/2/2023 访问量:54

问:

在 C++ 标准中,可选的复制构造函数定义如下:

constexpr optional(const optional& rhs);

Effects: If rhs contains a value, direct-non-list-initializes the contained value with *rhs.

如果包含一个值,它将被复制构造,并且由于复制构造函数被定义为删除,除非is_copy_constructible_v为真,为什么标准使用更通用的“direct-non-list-initialization”而不是说?rhs"If rhs contains a value, it 'copy constructs' the contained value with *rhs"

C++ std可选

评论

0赞 user17732522 10/2/2023
"copy construct“实际上没有明确定义。您似乎希望它调用复制构造函数,但非类类型没有。一个类也可能有多个复制构造函数,因此也没有很好地定义您指的是哪一个。等等......另一方面,“direct-non-list-initialize”非常清楚:它的行为就像通过(而不是 或 或T copy(source);T copy = source;T copy{source};T copy = {source};)

答:

1赞 273K 10/1/2023 #1

如果 ,则两者都是直接初始化的。但是,如果具有初始值设定项列表构造函数,则对于大括号初始化项(列表初始化),它将始终优先于其他构造函数。如果同时具有复制构造函数和 initializer-list 构造函数,则后者用于 。A aA a1(a)A a2{a}AAA a2{a}

效果:如果包含值,则 direct-non-list-初始化包含的值。rhs*rhs

该标准要求使用直接初始化的复制构造函数,如果删除了复制构造函数,则不得使用 direct-list-initializing 构造函数。A(const A&)

评论

0赞 Jan Schultke 10/2/2023
没有“直接复制初始化”这样的东西。我认为您的意思是“直接初始化”,并且将调用复制构造函数。
0赞 273K 10/2/2023
我只是说使用复制构造函数直接初始化,我没有使用任何特定术语,否则我会将它们设置为斜体。