显式复制构造函数不允许使用类似的东西Foo foo = bar;
,并强制执行复制用法Foo foo(bar);
.此外,显式复制构造函数还禁止通过函数的值返回对象.但是,我尝试用大括号替换副本初始化,就像这样
struct Foo
{
Foo() = default;
explicit Foo(const Foo&) = default;
};
int main()
{
Foo bar;
Foo foo{bar}; // error here
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误(g ++ 5.2)
错误:没有匹配函数来调用'Foo :: Foo(Foo&)'
或(clang ++)
错误:struct initializer中的多余元素
删除explicit
使得代码在g ++下可编译,clang ++仍然失败并出现相同的错误(感谢@Steephen).这里发生了什么?统一初始化是否被视为初始化列表构造函数(胜过所有其他构建函数)?但如果是这种情况,为什么程序在复制构造函数非显式时编译?
c++ copy-constructor language-lawyer uniform-initialization c++11
初始化对抽象类型的引用时,构造函数初始化列表中的{}初始化如何与()初始化不同?以下课程栏:
class AbstractBase
{
public:
AbstractBase() {}
virtual ~AbstractBase() = default;
virtual void ab() = 0;
};
class Foo : public AbstractBase
{
public:
Foo() {}
void ab() {}
};
class Bar
{
public:
Bar(const AbstractBase& base) : myBase{base} {}
private:
const AbstractBase& myBase;
};
int main()
{
Foo f{};
Bar b{f};
}
Run Code Online (Sandbox Code Playgroud)
编译时,我收到错误
test5.cpp: In constructor ‘Bar::Bar(const AbstractBase&)’:
test5.cpp:22:48: error: cannot allocate an object of abstract type ‘AbstractBase’
Bar(const AbstractBase& base) : myBase{base}
^
test5.cpp:2:7: note: because the following …
Run Code Online (Sandbox Code Playgroud) 为什么这段代码会出错而不是调用move-constructor?
struct A
{
};
int main()
{
A a{A()}; // error: too many initializers for 'A'
}
Run Code Online (Sandbox Code Playgroud)
演示:http://coliru.stacked-crooked.com/a/ce822fcbda0f7db9
我是否可以使用统一初始化调用聚合上的构造函数?