问题标签 [direct-initialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ 对象构造——直接初始化与使用“=”操作符,它们是等价的吗?
在 C++ 中,这两种初始化类对象的方式在功能上是等效的,还是在某些情况下它们可能具有不同的语义并生成不同的代码?
对比
c++ - C++ 字符串流初始化
我有两个代码片段:
这不会编译:
这样做:
我的理解T foo = expr
是这样的T foo(expr)
。因此,这两个字符串流初始化不是等效的吗?为什么一个编译而另一个不编译?
c++ - 初始化类类型时直接初始化会出错
std 说在直接初始化中,隐式转换为 T 参数的构造函数之一是适用的。为什么带有两个参数的第二次初始化会引发错误?
c++ - C++ 中的初始化
C++中直接初始化和统一初始化有什么区别?
写和写有什么区别
和
c++ - 在按值返回的函数的 return 语句中初始化
我的问题源于对std::move
inreturn
语句的深入研究,例如以下示例:
打印 (MSVC, /std:c++17, release)
我对按值返回的函数中返回语句的一般初始化规则以及在返回局部变量时适用哪些规则感兴趣,std::move
如上所示。
一般情况
关于退货声明,您可以阅读
- 计算表达式,终止当前函数,并在隐式转换为函数返回类型后将表达式的结果返回给调用者。[...]
在 cppreference.com 上。
其中复制初始化发生
- 当从一个按值返回的函数返回时
回到我的例子,根据我目前的知识 - 与上述规则相反 -A a1(nrvo());
是一个使用 prvalue直接初始化nrvo()
a1 的语句。那么,如 cppreference.com 中针对返回语句所述,哪个对象被复制初始化了呢?
std::move
案例_
对于这种情况,我参考了 ipc 关于Are returned locals automatically xvalues的回答。我想确保以下内容是正确的:std::move(local)
具有类型A&&
但no_nrvo()
被声明为返回类型A
,所以这里
将表达式的结果隐式转换为函数返回类型后返回给调用者
部分应该发挥作用。我认为这应该是左值到右值的转换:
任何非函数、非数组类型 T 的泛左值都可以隐式转换为相同类型的纯右值。[...] 对于类类型,此转换 [...] 将 glvalue 转换为 prvalue,其结果对象由 glvalue 复制初始化。
使用to convert from A&&
toA
A
的移动构造函数,这也是这里禁用 NRVO 的原因。这些规则是否适用于这种情况,我是否理解正确?此外,他们再次说由 glvalue复制初始化A a2(no_nrvo());
,但它是直接初始化。所以这也涉及到第一种情况。