【发布时间】:2015-10-24 21:57:19
【问题描述】:
显式复制构造函数不允许 Foo foo = bar; 之类的东西,并将复制用法强制为 Foo foo(bar);。此外,显式复制构造函数也不允许从函数中按值返回对象。但是,我尝试用大括号替换复制初始化,就像这样
struct Foo
{
Foo() = default;
explicit Foo(const Foo&) = default;
};
int main()
{
Foo bar;
Foo foo{bar}; // error here
}
我得到了错误 (g++5.2)
错误:没有匹配的函数调用 'Foo::Foo(Foo&)'
或 (clang++)
错误:结构初始化程序中的元素过多
删除explicit 使代码在g++ 下可编译,clang++ 仍然失败并出现同样的错误(感谢@Steephen)。这里发生了什么?统一初始化是否被视为初始化列表构造函数(胜过所有其他构造函数)?但是如果是这样的话,为什么在拷贝构造函数不显式的情况下程序会编译呢?
【问题讨论】:
-
clang 即使没有
explicit关键字coliru.stacked-crooked.com/a/1cca94237ee00ea3也会显示错误 -
@Steephen 确实,我没有看到。所以这是另一个时髦的语言律师类型问题:)
-
我会说编译器选择聚合初始化
foo。 -
@Jarod42 你可能是对的,考虑到错误消息,这是有道理的。
-
似乎是这样,因为添加
int成员提供no viable conversion from 'Foo' to 'int': Demo (并且在没有explicit的情况下,gcc 的行为仍然不同...)
标签: c++ c++11 language-lawyer copy-constructor uniform-initialization