当前位置: 首页 > 知识库问答 >
问题:

在下面的代码段中,gcc和clang都省略了对move构造函数的调用。这是正确的吗?

谢骏奇
2023-03-14
#include <iostream>
struct D;
struct S{ operator D(); };

struct D{
    D(){}
    D(D&&) { std::cout << "move constructor" << '\n'; }
};

S::operator D() { std::cout << "conversion function" << '\n'; return D(); }

int main()
{
    S s;
    D d(s);
}

>

  • 本案在§8.5/16(N3337)中的第一个子要点中有所涉及,其中没有提到省略。

    如果初始化是直接初始化,或者如果初始化是复制初始化,源类型的CV限定版本与目标类型的类相同,或者是目标类型的派生类,则考虑构造函数。列举了适用的构造函数(13.3.1.3),并通过过载解析选择了最佳构造函数(13.3)。调用这样选择的构造函数来初始化对象,将初始化器表达式或表达式列表作为其参数。如果没有应用构造函数,或者重载解析不明确,则初始化格式不正确。

  • 共有1个答案

    景康安
    2023-03-14

    C++标准喜欢为在一个地方定义的规则创建异常,在一个完全不同的地方。

    复制/移动省略规则在12.8/31中指定。代码中有两个复制/移动操作要消除。

    第一个简单:在运算符d中,返回表达式中构造的临时值被移动到表示函数返回值的临时值。子弹3允许删除此移动。

      null
     类似资料:
    • 假设我们有以下简单的代码: 这段代码使用clang编译并打印“T”,但使用gcc我们有以下错误: 我的问题是哪个编译器有bug,gcc还是叮当声?

    • 运行此代码时,Clang(3.9.1)和GCC(7,快照)将“1”、“2”打印到控制台。 但是,MSVC未能编译此代码: source_file.cpp(15):错误C2668:字典::集:对重载函数的模糊调用 source_file.cpp(9):注意:可能是“无效字典::集(int64_t)” source_file.cpp(8):注意:或'无效字典::集(const char*)' 源文件。

    • 我熟悉在一个账户和另一个账户之间转账时使用同步的并发示例,例如,两个账户的锁定是按账号顺序进行的,这样就不会发生死锁。 我想探索使用Reenter antReadWriteLock,因为在我看来,这将允许帐户对象的客户端进行并发读取,前提是没有客户端更新该对象。 我已经编写了代码并对其进行了测试,它似乎可以工作,但看起来有点难看,例如,Account类暴露其锁对象看起来有点奇怪,但它似乎必须这样做

    • 说我有以下课程 和 当我调用超级构造函数时,如何保证子构造函数调用“正确”的构造函数?更具体地说,我希望100%确保我传入的三个字符串值确实设置为父级中的正确字段,而不是设置为item1 in的字段。 我知道我可以,例如: 显式创建我自己的所有参数构造函数 在子构造函数中,调用父构造函数的所有setter 但是我只是好奇Lombok是否足够聪明,以某种方式,将子类中的字段设置为父类中正确的字段?

    • 统计了一下,公司java面试题里错误率在70%以上的一道题。初级java真难招啊... 下面isEmptyString函数正确的是:

    • 我试图移植一些为GCC(8.2)编写的代码以供Clang编译: GCC 8.2(和12.1)很好地编译了代码。然而,Clang 11.0.0(和14.0.0)抱怨说,从fe到feh的调用在无效feh之间不明确(Fn https://godbolt.org/z/5E9M6a5c6 哪个编译器是正确的? 如何编写这段代码以便两个编译器都接受它? 这两个和折叠表达式都可以在C 17中使用,但这是许多项目