所以我有这段代码:
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得到的规则说:
最佳答案
首先,从Bar
到long long
的隐式转换以及从long long
到Foo
的隐式转换都是用户定义的转换。Foo foo = Bar(13);
执行copy initialization,编译器将尝试隐式将Bar
转换为Foo
。需要进行两次隐式转换,即将Bar
转换为long long
,然后将long long
转换为Foo
。但是在一个implicit conversion序列中仅允许一次用户定义的转换。
Foo foo(Bar(13));
执行direct initialization。将检查Foo
的构造函数,并通过重载分辨率选择最佳匹配。仅需要一次隐式的用户定义转换(从Bar
到long long
);之后,调用Foo::Foo(long long)
直接构造foo
。