问题标签 [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.

0 投票
2 回答
234 浏览

c++ - 模板类中没有匹配的函数

当我尝试在我的 mingw32 编译器上编译此代码时,我没有收到匹配的成员函数错误

有人请告诉我如何解决这个问题。

0 投票
2 回答
7175 浏览

c++ - 什么时候应该使用直接初始化,什么时候应该使用复制初始化?

它是简单的偏好还是有特定的情况需要一个而不是另一个?我指的是以下变体进行初始化

0 投票
6 回答
826 浏览

c++ - 复制初始化的奇怪行为,不调用复制构造函数!

我正在阅读直接初始化和复制初始化之间的区别(第 8.5/12 节):

我从阅读有关复制初始化的内容中了解到,它需要可访问且非显式的复制构造函数,否则程序将无法编译。我通过编写以下代码来验证它:

GCC 给出一个错误(ideone)说:

prog.cpp:8: 错误: 'A::A(const A&)' 是私有的

到目前为止一切都很好,重申 Herb Sutter 所说的话,

复制初始化是指使用复制构造函数对对象进行初始化,必要时先调用用户定义的转换,等价于“T t = u;”的形式:


之后,我通过注释private关键字使 copy-ctor 可访问。现在,我自然希望打印以下内容:

A(常量 A&)

但令我惊讶的是,它改为打印(ideone):

A(int i)

为什么?

好吧,我知道首先A创建10一个类型的临时对象int,通过使用A(int i),在此处根据需要应用转换规则(第 8.5/14 节),然后它应该调用 copy-ctor 来初始化a。但它没有。为什么?

如果允许实现消除调用复制构造函数的需要(第 8.5/14 节),那么为什么在声明复制构造函数时它不接受代码private?毕竟,它没有调用它。这就像一个被宠坏的孩子,他先恼火地要一个特定的玩具,当你给他一个,那个特定的玩具,他就把它扔在你背后。:|

这种行为会不会很危险?我的意思是,我可能会在 copy-ctor 中做一些其他有用的事情,但如果它不调用它,那么它不会改变程序的行为吗?

0 投票
3 回答
2222 浏览

php - PHP OOP 中 $a=&$b 、 $a = $b 和 $a= clone $b 之间的区别

和在 PHP OOP 中$a = &$b有什么区别?是一个类的实例。$a = $b$b = clone $a$a

0 投票
1 回答
181 浏览

c++ - POD 变量的直接初始化不起作用,但在将变量推送到向量时复制初始化会起作用

为什么下面的代码编译失败,而后面的两个例子编译成功?我在 Windows 7 上使用 VS 2008。


直接初始化 POD(失败):


POD的拷贝初始化(成功:

0 投票
1 回答
122 浏览

c++ - 为什么复制初始化是这样的?为什么需要复制构造函数?

可能重复:
复制和直接初始化行为不同的动机是什么?

通过复制初始化,我的意思是这样的:

尽管使用 C++ 编程多年,但我从未意识到上面的代码需要复制构造函数(感谢 jogojapan)。临时性总是被忽略,因此我什至不知道它甚至存在(至少在表面上,尽管它被优化掉了),直到它被指出给我。

经过大量的谷歌搜索后,我明白了它是如何工作的。我的问题是为什么会这样?

为什么标准没有使上面的示例不需要复制构造函数?是否有一些特定的案例/示例表明在这种类型的初始化中需要复制构造函数很重要?

如果没有一个体面的解释为什么事情会这样,我只是认为这是一个令人讨厌的人工制品,但如果我遗漏了一些重要的东西,我宁愿不要无知。

0 投票
2 回答
143 浏览

c++ - C++复制初始化+隐式构造函数调用=失败

这段代码:

在线出错bar b = 3(g++ 4.7.1 with -fstd=gnu++11):

但是,我提供了一个bar构造函数,它采用foo, 并且 ints 可以隐式转换为foo如前面的行所示。那么,出了什么问题?

顺便说一句,出于多种原因,不希望强制转换为foo使用foo(3),因为这会使我的实际代码难看使用和阅读。

0 投票
2 回答
1482 浏览

c++ - C++(11):如果两者都很好,何时使用直接或复制初始化

在重复的呼喊开始之前:我知道以下问题(和其他一些问题)与这个问题非常相关:

复制初始化和直接初始化在 C++ 中有区别吗?

这个问题的答案完美地解释了无法进行复制初始化的场景,并解释了两者的区别以及所有这些东西。但是,我的问题更微妙:

考虑代码:

假设 A 可以隐式复制构造和所有这些东西,所以 和 的初始化a1a2很好。的复制构造函数中没有副作用A,因此两个初始化在语义上也是等效的。createA()直接返回变量的类型,而不是必须首先转换的其他内容。我认为这种情况很常见。

那么,在这种情况下,如果两种替代方案同样适用且在语义上等价,我应该使用哪一种?规范中是否有建议或社区中的共识/最佳实践,还是由我和我的编码风格决定使用哪一种?与旧标准相比,C++11 有什么不同吗?

0 投票
2 回答
759 浏览

c++ - Is it possible to infer template parameters of tuple from brace-type initialization?

In this example, is it possible to allow the deduction of the template parameters type of the tuple?

I added the second argument other to avoid solutions involving variadic arguments at the level of the function fun. Also, I am trying to avoid the use of make_tuple, at least from the user code (i.e. in main()). In fact it doesn't need to be the tuple type the one involved as long as the "desired syntax" is allowed and somehow its element types can be deduced at later stage.

(Also, although similar, this has nothing to do with initializer_list since it doesn't work at all having dissimilar elements in the braces)

It fails at least with clang 3.2 and gcc 4.7.2. Is there any hope that it would work with the current or a near-future standard? (e.g. a future(?) initializer_tuple.)

(This can be very useful to add expressiveness to function calls, by aggregating subelements, but that can be argued about)


Note: For the example code it seems that std::forward_as_tuple is more appropriate than std::make_tuple so the arguments are not necessarily copied: http://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple . Still not as nice as if there were a build-in language feature for heterogeneous initializer lists.

0 投票
1 回答
2364 浏览

c++ - 为什么我不能从字符串复制初始化字符串流?

以下代码在 GCC、Clang 和 Visual Studio 中失败:

我认为直接初始化有效而复制初始化无效的唯一情况是构造函数是显式的,在这种情况下不是。这是怎么回事?