问题标签 [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 回答
434 浏览

c++ - 复制“= {}”形式的初始化

鉴于以下情况:

到目前为止,一切都很好。现在,如果我启用转换运算符Y::operator X(),我会得到这个;-

我的理解是,发生这种情况是因为(2)比(3)“更少”,因此是首选。X省略了对构造函数的调用

我的问题是,为什么定义没有X k = {y}以同样的方式改变它的行为?我知道这= {}在技术上是“列表复制初始化”,但是在没有构造函数采用initializer_list类型的情况下,这不会恢复为“复制初始化”行为吗?ie - 与 for 相同X m = y

我的理解的漏洞在哪里?

0 投票
1 回答
233 浏览

c++ - 这些转换中的哪一个应该是模棱两可的?

我有一些如下代码:

GCC 在 [2] 而不是 [1] 处给出错误。Clang 两者都出错,显然 MSVC 两者都没有出错。谁是对的?

0 投票
1 回答
101 浏览

c++ - 放宽 C++17 中的复制初始化要求

我对cppref语句感到困惑:

[...] 如果使用了转换构造函数,则转换结果是纯右值表达式(自 C++17 起),然后用于直接初始化对象。 最后一步通常被优化,转换的结果直接在为目标对象分配的内存中构造,但是即使不使用适当的构造函数(移动或复制)也需要可访问。(直到 C++17)

std::atomic_int atom = 1;我在 gcc 8.0.1 上测试了代码,它使用 C++17 编译,但使用 C++14失败,出现以下错误:

这是否意味着(总是?)不再需要在 C++17 中访问适当的构造函数(移动或复制)?

0 投票
2 回答
1063 浏览

c++ - 复制初始化 - 从“int”转换为非标量类型

我想知道我应该如何定义类 my_int 以便从 int 转换std::complex< my_int >为由编译器完成,而不是由我手动完成。

my_int如果 4 未强制转换为“ ” ,则以下程序无法编译

我知道如果您使用它进行初始化cistd::complex<my_int> ci(4)但我希望它与复制初始化一起使用。

0 投票
2 回答
207 浏览

c++ - 复制初始化:为什么即使关闭复制省略也不调用移动或复制构造函数?

我的问题不同,因为我可能“知道”复制省略。我正在学习复制初始化。但是,下面的代码让我很困惑,因为我已经关闭了复制省略使用-fno-elide-contructors -O0选项。

我首先使用命令构建: g++ -std=c++11 -fno-elide-constructors -O0 main.cpp -o main我得到的结果如下:

然后我用没有-fno-elide-constructor -O0选项的命令进行构建,以证明g++确实关闭了我之前构建中的优化。

那么,为什么test instance = {1,2}不调用复制构造函数或移动构造函数呢?不是从隐式转换创建的临时对象吗?并且instance应该由那个临时对象初始化?

0 投票
1 回答
37 浏览

c++ - 澄清我对复制初始化和直接初始化的见解

定义一个类如下:

下面的代码将执行直接初始化:

以下将执行复制初始化:

据我了解,A a4 = "Hello"相当于:

那么A a3 = a1和 和有什么不一样A a2(a1)?似乎他们都调用了复制构造函数。我上面的评论是否正确?(没有编译器优化)

0 投票
1 回答
60 浏览

c++ - 在c ++中的一个声明语句中继续复制构造函数/初始化时使用链方法?

如您所知,我们通常使用按引用返回进行方法链接,我在第一个代码中使用按引用返回,输出与我预测的一样。在第二个代码块中,当我没有使用通过引用返回时,链被破坏并且没有生成我预期的输出,但是在第三个代码块中,我在继续复制中使用链方法达到了预期的结果一个声明语句中的构造函数/初始化(不使用按引用返回),问题是,保护链不被破坏的第三个代码背后的逻辑是什么?



0 投票
1 回答
57 浏览

c++ - 为什么复制列表初始化和复制初始化在这种情况下表现不同?

似乎复制初始化不允许隐式转换const char *string而复制列表初始化和直接初始化允许它。

0 投票
1 回答
263 浏览

c++ - 为什么我的类的复制初始化不适用于使用字符串文字的 string_view?

我有以下代码:

当我这样做时,一切都可以正常编译(使用 clang v8,C++17):

但是,如果我使用复制初始化它会失败:

诊断:

查看 string_view的构造函数,我没有看到任何需要的重载,char const[]这可能是问题吗?我意识到我可以用它"testing"sv来解决这个问题,但我觉得字符串文字大小写也应该有效。

为什么复制初始化案例不起作用?如何使它与字符串文字一起使用?

0 投票
1 回答
100 浏览

c++ - 原始(标量)类型的差异复制初始化和直接初始化

据我所知,C++ 是形式的初始化

称为复制初始化和形式的初始化

或者

称为直接初始化

(T...类型,x...变量名,a...表达式)

对于类类型,我认为区别很明显(在复制初始化的情况下调用复制构造函数)。

但是如果使用像 int 这样的原始(标量)类型呢?因为 int 类型没有(复制)构造函数,所以应该调用哪个构造函数

那么有区别吗?

这里到底发生了什么?或者,如果涉及原始/标量类型并且都是语法糖,那么没有区别。类似的问题并不能完全为我解释。