据我所知,当我们有一组重载函数时,首先执行重载决策,并且只检查之后的访问说明符(例如=delete
),而不是相反。换句话说,下面的代码
void f(int);
void f(double) = delete;
int main()
{
f(42.2); // error, use of deleted function
}
产生错误,因为f(double)
是最佳匹配并被删除,并且编译器没有"回退"在f(int)
。
我也知道将析构函数标记为=delete
将隐式删除移动构造函数。所以,我期待以下代码
struct Foo
{
Foo() = default;
Foo(const Foo&) = default;
~Foo() = default; // implicitly deletes the move ctor
};
int main()
{
// Why doesn't the implicitly deleted move ctor
// participate in overload resolution?
Foo mfoo = Foo{};
}
失败,因为移动构造函数是delete
d,而是编译器"落到复制构造函数"。这是C ++重载解析过程中的一个例外吗?