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/

10-09 05:38
查看更多