所以我有这段代码:

struct Foo {
    Foo() { cout << "default\n"; }
    Foo(const long long) { cout << "implicit\n"; }
};

struct Bar {
    Bar(const short param) : param(param) {}
    operator long long() const { return static_cast<long long>(param); }
    const short param;
};

我以为Foo foo = Bar(13)会使用我的隐式强制转换,然后再使用转换构造函数。 But it errors:



虽然可以正常工作:Foo foo(Bar(13))。为什么我的隐式强制转换用于显式转换构造,而不用于隐式转换构造?

我从https://en.cppreference.com/w/cpp/language/copy_initialization得到的规则说:

最佳答案

首先,从Barlong long的隐式转换以及从long longFoo的隐式转换都是用户定义的转换。
Foo foo = Bar(13);执行copy initialization,编译器将尝试隐式将Bar转换为Foo。需要进行两次隐式转换,即将Bar转换为long long,然后将long long转换为Foo。但是在一个implicit conversion序列中仅允许一次用户定义的转换。


Foo foo(Bar(13));执行direct initialization。将检查Foo的构造函数,并通过重载分辨率选择最佳匹配。仅需要一次隐式的用户定义转换(从Barlong long);之后,调用Foo::Foo(long long)直接构造foo

10-06 01:42
查看更多