class AAA {
public:
explicit AAA(const AAA&) {}
AAA(int) {}
};
int main() {
AAA a = 1;
return 0;
}
上面引号中加粗的direct-initialize
表示对复制构造函数的调用是显式的,对吗?是G++错了还是我对标准的解释错了?
看起来这个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显
所以我正在学习构造函数初始值设定项列表,我写了以下代码: 为此我使用了g编译器。它调用的是构造函数而不是复制构造函数。它应该调用复制构造函数,因为我正在创建一个对象来创建另一个对象?这里的问题是什么,标准对此怎么说?