gpt4 book ai didi

c++ - 初始化:括号与等号

转载 作者:IT老高 更新时间:2023-10-28 12:36:11 36 4
gpt4 key购买 nike

有什么区别

T a(b);

T a = b;

T a = T(b);

?

最佳答案

T a( b );

直接初始化,除非它被解析为函数声明,在这种情况下它是一个函数声明。

T a = b;

复制初始化,这意味着它就像在右侧构造一个临时对象一样工作,然后a是复制构造的,或者在C中++11 及更高版本,可能从该临时移动构造。

编译器可以在可能的情况下自由地删除(删除)临时+复制/移动,但是复制或移动构造函数,无论在逻辑上使用哪个,都必须仍然是可访问的,而不是显式

例如,在 C++03 中,您不能复制初始化 std::ostringstream,因为它没有复制构造函数。在 C++11 中,如果初始化程序是临时的,则可以复制初始化 ostringstream,这会导致逻辑移动构造(但通常会被省略,优化掉)。比如这个拷贝初始化声明,

ostringstream s = ostringstream( "blah" );

... 不能编译为 C++03,因为在 C++03 中,复制初始化会调用不存在的类的复制构造函数。然而,它确实编译为 C++11,因为在 C++11 中,复制初始化调用了移动构造函数。虽然(为了保持其作为流的错觉)std::ostringstream 不能直接复制,但它可以移动。

另一个这样的区别:在 C++03 中,只有复制初始化语法支持 花括号 初始化器,在 C++03 中,当 T 是聚合时可以使用它类型,例如原始数组。在 C++11 中,花括号符号已被扩展并概括为 统一初始化语法,因此它也可以用于直接初始化。所以下面直接初始化声明,

int v[]{ 3, 1, 4, 1, 5, 9, 2, 6, 5, 4 };

… 不编译为 C++03,但编译为 C++11 及更高版本。

= 复制初始化语法是 C 的原始初始化语法。

在 C++11 及更高版本中,由于移动语义,它可以用于比 C++03 更广泛的情况,例如与 std::ostringstream .

关于c++ - 初始化:括号与等号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4470553/

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