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

在复制初始化中,对复制构造函数的调用是显式的还是隐式的?

金毅
2023-03-14
class AAA {
public:
    explicit AAA(const AAA&) {}
    AAA(int) {}
};


int main() {
    AAA a = 1;
    return 0;
}

上面引号中加粗的direct-initialize表示对复制构造函数的调用是显式的,对吗?是G++错了还是我对标准的解释错了?

共有1个答案

许博达
2023-03-14

看起来这个bug:在复制初始化的第二步中,G++无法调用显式构造函数

G++无法编译以下代码

struct X
{
    X(int) {}
    explicit X(X const &) {}
};

int main()
{
    X x = 1; // error: no matching function for call to 'X::X(X)'
}

复制初始化的第二步(见8.5/16/6/2)是直接初始化,其中显式构造函数应被视为候选函数。

 类似资料:
  • 显式复制构造函数不允许类似于的东西,并将复制使用强制为。此外,显式复制构造函数也不允许从函数中按值返回对象。然而,我尝试用大括号替换复制初始化,就像这样 我得到的错误(g 5.2) 错误:没有匹配的函数用于调用'Foo::Foo(Foo 或(叮当声) 错误:结构初始值设定项中的元素过多 删除使代码在g下可编译,但clang仍然会失败,并出现相同的错误(感谢@stophen)。这是怎么回事?统一初始

  • 考虑以下代码: 以下是一些引用的标准 拷贝初始化 从cppreference复制引用的初始化 如果object是lvalue表达式,其类型是T或从T派生的,且具有相等或较少CV限定性,则该引用绑定到由lvalue标识的对象或其基类子对象。 如果object是lvalue表达式,其类型隐式转换为T或从T派生的类型,具有相等或较少CV限定性,则考虑源类型及其基类返回lvalue引用的非显式转换函数,并

  • 有人告诉我构造函数复制是一种浅层复制方法。 通常情况下,如果我修改了List ints的第一个元素,那么List intscope中的相应元素应该已经修改为31了,对吗?因为变量intscope和ints引用了同一个对象,但我得到了这个输出。 举个例子,我的意思是: 我得到这样的输出: 因为变量arr和arr2引用了同一个对象。如果我修改了数组中的一个元素,那么其他元素也会产生影响。当我使用列表进

  • 被关闭为非缺陷(NAD),其基本原理如下 2021-06-14反射器轮询: 当前的措辞阻止了来自的隐式转换序列。 但是考虑到上面反射者的评论,我可能错了。可能是[over.match.list]/1 在复制列表初始化中,如果选择显式构造函数,则初始化格式不正确。[注意:这与其他情况([over.match.ctor],[over.match.copy])不同,在其他情况下,复制初始化只考虑转换构造

  • 在G++中。如果复制构造函数不是显式的,代码可以编译并正常工作(但我希望强制执行只有对对象的引用才能用作参数和返回值)。代码还在删除对的调用后进行编译(因此不成问题)。因此,我的问题是,std::sort在调用使编译此代码失败的比较函数时会做什么,以及如何修复它。 经过大量的研究,唯一接近我的问题是复制初始化,对复制构造函数的调用是显式的还是隐式的?它链接到GCC中的一个bug。然而,clang显

  • 之前我们使用大括号声明并初始化了一些Time结构: Time currentTime = { 9, 14, 30.0 }; Time breadTime = { 3, 35, 0.0 }; 现在,通过使用构造函数,我们能用另一种方式来声明和初始化: Time time (seconds); 这两个函数展现了不同的编程风格,以及在C++历史上不同的观点。可能是出于这个原因,C++编译器要求你使用