如何在隐式删除的移动构造函数的情况下执行重载决策?

时间:2015-11-22 01:14:20

标签: c++ c++11 language-lawyer overload-resolution

据我所知,当我们有一组重载函数时,首先执行重载决策,并且只检查之后的访问说明符(例如=delete ),而不是相反。换句话说,下面的代码

void f(int);
void f(double) = delete;

int main()
{
    f(42.2); // error, use of deleted function
}

Live on coliru

产生错误,因为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{};
}

Live on Coliru

失败,因为移动构造函数是delete d,而是编译器"落到复制构造函数"。这是C ++重载解析过程中的一个例外吗?

0 个答案:

没有答案