C++ 14标准(N4296)在8.5/17.6.1中说
因此,在直接初始化中,仅考虑构造函数-忽略转换函数。在以下代码中,没有适用的A
构造函数,只有B
的转换函数。但是,代码可以编译,为什么呢?
struct A{};
struct B{
operator A(){ return A{}; }
};
int main() {
B b;
A a(b); // direct-initialization
}
最佳答案
您是正确的,在做A
时只考虑A a(b);
的构造函数。 [over.match.ctor]/1状态
重点矿
这意味着A()
,A(const A&)
和A(A&&)
是候选列表。然后我们有[over.match.viable]/4
这允许将b
隐式转换为A
,以便可以调用A(A&&)
。
关于c++ - 直接初始化中的转换运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56690417/