问题标签 [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++ - 为什么初始化具有已定义 ctor 类型的值的对象不会调用复制构造函数?
您好,我有一个简单的问题:如果我有一个类,它的构造函数采用例如整数,那么如果我复制初始化该类的对象,则调用复制构造函数或构造函数:
- 正如你所看到的,我在这里有一个模棱两可的地方:
M m = 9;
我认为它是一种Copy-initialization
通常我认为应该调用 copy-ctor 或 move-ctor 的形式。我已声明主题已删除以获取编译时错误,但它有效吗?
c++ - 在 C++ 中初始化变量的 = 和 {} 语法之间的区别
我已经阅读了很多 C++ 代码,并且遇到了两种初始化变量的方法。
方法一:
方法二:
我知道这int score {};
会将分数初始化为 0,因此也会int score = 0;
这两者有什么区别?我已阅读初始化:括号与等号,但这并不能回答我的问题。我想知道等号和花括号之间有什么区别,而不是括号。在什么情况下应该使用哪一个?
c++ - 复制构造函数隐式转换问题
部分答案在这里给出
当钥匙explicit
被移除时,它们都可以工作。
以下解释对于复制初始化 ( foo2 obj22=obj1
) 是否正确:
首先编译器使用构造函数创建一个临时对象:
foo2(foo1& other) {}
然后它尝试在复制构造函数中使用这个临时对象:
foo2(foo2& other) {}
但它可能不会将临时对象绑定到非常量引用并发出错误。当您使用等号时,就会使用所谓的复制初始化。
如果是,那么foo2(foo1& other) {}
在更进一步之前不应该禁止它本身,因为临时不能绑定到非 const 引用?
抱歉,这个问题很长,我的困惑基本上是在存在/不存在显式关键字(带/不带 const)的情况下直接初始化和复制初始化的差异行为
c++ - 当有可用的右值构造函数时,为什么从右值调用类引用构造函数重载?
这段代码
意外引发以下编译器错误:
当我删除第二个构造函数重载A(A& a)
时,一切都按预期工作。我想编译器错误地调用了第二个构造函数而不是第一个。
为什么会这样?
我怎样才能让一个具有引用构造函数和右值构造函数的类和谐地工作?
我使用 GNU GCC。
注意:我还注意到一些奇怪的事情:显然,如果我用 替换该行A a = j;
,A a(j);
一切都会按预期工作。void f(A a)
然而,这并不令人满意,因为如果我试图从函数参数初始化对象(例如:调用with f(j)
),它仍然不起作用。
c++ - C++ 对象构造——直接初始化与使用“=”操作符,它们是等价的吗?
在 C++ 中,这两种初始化类对象的方式在功能上是等效的,还是在某些情况下它们可能具有不同的语义并生成不同的代码?
对比
c++ - C++ 字符串流初始化
我有两个代码片段:
这不会编译:
这样做:
我的理解T foo = expr
是这样的T foo(expr)
。因此,这两个字符串流初始化不是等效的吗?为什么一个编译而另一个不编译?
c++ - 为什么这种复制初始化(带有两个隐式转换)在 GCC/Clang 中不起作用?
请考虑以下代码:
Clang 会输出错误(GCC 也有类似的输出):
上述代码中,由于构造函数不显式,const char*
可以隐式转换为cstring
,cstring
也可以隐式转换Name
为 ;const char*
因此存在从到的转换序列Name
。那么为什么 Clang/GCC 不允许这样的复制初始化(msvc 允许这种情况)?
c++ - 在 C++ 中进行复制初始化时实际发生了什么?
考虑以下代码:
当我使用 g++8.1 编译-fno-elide-constructors
取消 RVO 时,输出为:
我知道这是一种叫做转换构造函数的东西,一种从其参数类型到其类类型的隐式转换。
似乎首先一个临时对象是由 构造的A(int)
,其次是a
对象是由复制构造函数构造的A(const A&)
。
但是当我修改我的代码时:
对象是显式b
复制构造的,这让我很困惑?!即使我使用复制初始化?
当我删除复制构造函数时,它不会按预期工作。A(const A&a)=delete;
但是,当我使用 VS2017 时,情况就不同了。隐式转换A a = 1;
与复制构造函数无关。即使我删除了 cc,它也照常工作。
c++ - 对 C++ 构造函数删除感到困惑
这是我的课
在另一个文件中,我可以像这样调用构造函数:
这解决了复制构造函数,而不是我期望的那个,为什么?
c++ - 引用类型复制初始化的问题
考虑上面的代码,标准说:
否则:
- 5.2.2.1 如果T1 或 T2 是类类型并且 T1 与 T2 没有引用相关,则用户定义的转换被认为是使用通过用户定义的转换来复制初始化类型为“cv1 T1”的对象的规则([ dcl.init]、[over.match.copy]、[over.match.conv]);如果相应的非参考复制初始化格式错误,则程序格式错误。调用转换函数的结果,如针对非引用复制初始化所描述的,然后用于直接初始化引用。对于这种直接初始化,不考虑用户定义的转换。
- 5.2.2.2 否则,初始化表达式被隐式转换为“cv1 T1”类型的纯右值。应用临时实现转换并将引用绑定到结果。
那么,上述案例服从哪个项目符号?初始化表达式Test
通过转换构造函数Test::Test(Data)
而不是conversion function
. 但是请注意 中强调的部分5.2.2.1
,它表示调用转换函数的结果然后用于直接初始化引用。在我的示例中,被调用的函数是转换构造函数,因此,结果是转换构造函数的结果。
问题一:
哪个项目符号涵盖了我的示例?5.2.2.1
还是5.2.2.2
?
5.2.1.2 有一个类类型(即T2是一个类类型),其中T1与T2没有引用相关,可以转换为“cv3 T3”类型的右值或函数左值,其中“cv1 T1”是与“cv3 T3”参考兼容(参见[over.match.ref]),
考虑一下子弹5.2.1.2
,它已经涵盖了类型T2
是类类型的情况,并且可以转换为cv3 T3
through conversion function
。
问题 2:
那么,5.2.2.1
coversT2
是类类型是不是多余,可以通过转换成destination类型呢conversion function
,这样的case已经覆盖了5.2.1.2
?