问题标签 [copy-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++ - 模板化类数组的参数推导隐式初始化
我有一个项目类,这实际上是一个 int 的包装器。我有一个模板化的节点类。我将项目类作为模板参数传递给它。
我想创建一个模板节点类的数组,但编译器不喜欢它。当我使用相同的语法创建单个对象时,它可以工作。为什么不能推导出数组元素来初始化模板类的数组?创建模板类的对象数组的正确方法是什么?
Heres item 类,它是一个int
.
这是模板化的节点类
继承人main()
这是错误消息
c++ - 复制初始化是否与副本的复制初始化相同?
以下两个代码段介绍了将变量初始化b
为a
. 第一个代码段使用复制初始化(使用 初始化=
)初始化变量。假设类Apple
被简单地定义为一个空类:class Apple {};
第二个代码段也使用复制初始化来初始化变量。虽然在初始化中复制的是a
.
盲读时,似乎一个副本发生在Apple(a)
,另一个发生在Apple b = ...
。相反,重写复制构造函数Apple
以在复制上打印某些内容表明在Apple b = Apple(a)
.
这两个语句是否Apple b = a;
相同Apple b = Apple(a);
?是否存在它们不相同的情况?
c++ - 为什么复制初始化需要 C++17 中的析构函数并保证移动/复制省略?
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());
,但它是直接初始化。所以这也涉及到第一种情况。
c++ - 不可复制的类可以在 C++ 中被值捕获吗?
在下一个程序中,B
带有已删除复制构造函数的结构被抛出并按值捕获:
Clang 拒绝代码并出现预期错误:
但是 GCC 很好地接受了该程序,演示:https ://gcc.godbolt.org/z/ed45YKKo5
哪个编译器在这里?