gpt4 book ai didi

c++ - 当不涉及复制时,为什么 std::string s = "123"被认为是复制初始化?

转载 作者:行者123 更新时间:2023-12-01 14:04:34 25 4
gpt4 key购买 nike

为什么是这种初始化 std::string 的方式:std::string s = "123";当实际上没有发生任何复制时,被认为是复制初始化?

在上面的例子中,编译器会看到有一个 std::string 是没有歧义的。接受 char const * 的构造函数,因此这里发生的是 std::string 的构造对象通过 char const * 的隐式转换至 std::string .这是一个如此清晰的场景。它只是调用 std::string(const char *)构造函数一次 , 干净利落。如此简单,甚至没有什么可谈论的优化,例如复制省略和移动。

现在,问题是,我从来没有对通过隐式转换(即类 a = 表达式)进行对象初始化有任何困惑,直到我开始遇到宣称 = 初始化是“复制初始化”的文献。甚至主要人物 Bjarne Stroustrup 本人也将这种初始化形式称为“复制初始化”。

在这一点上,我觉得我可能误会了什么。

那么,为什么在允许隐式转换的情况下显然不是这种情况的情况下,通过 = 初始化被视为复制初始化?

最佳答案

术语 copy-initialization仅用于以下形式的初始化语法:

T object = other;

此初始化的效果之一是:

If T is a class type, and the cv-unqualified version of the type of other is not T or derived from T, or if T is non-class type, but the type of other is a class type, user-defined conversion sequences that can convert from the type of other to T (or to a type derived from T if T is a class type and a conversion function is available) are examined and the best one is selected through overload resolution.



所以对于表达式:
std::string s = "123"; 

隐含 constructor这需要一个 const char *用于构造 std::string .

因此,即使其中包含“复制”一词,复制初始化并不意味着涉及实际的复制,之所以这么称呼,只是因为语法使它看起来像是正在发生复制。

关于c++ - 当不涉及复制时,为什么 std::string s = "123"被认为是复制初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62186261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com