当同样好的转换函数可用时,为什么重载解析更喜欢移动构造函数而不是非特殊构造函数?



以下程序:

#include <iostream>
struct A 
{ 
A() { std::cout << "A()n"; }
A(int) { std::cout << "A(int)n"; }
};
struct C {
operator int() {
std::cout << "operator intn";
return 42;
}
operator A() {
std::cout << "operator An";
return A();
}
};
int main() {
auto a = A{C{}};
};

编译并在运行时打印:

operator A
A()

参见Godbolt link。

这表明选择了A的移动构造函数来执行初始化,并调用C::operator A()C转换为移动构造函数所期望的类型。

或者,可以选择A::A(int)构造函数,并调用C::operator int()。但是A::A(int)显然失去了重载解析。

为什么会发生这种情况?我在标准中没有看到任何规则来解释为什么A的move构造函数赢得了重载解析。

(这个问题受到这个答案的启发;我不明白为什么那个答案中的代码可以工作。

似乎GCC和Clang在初始化cv2T类型的对象时,除了构造函数外,还直接考虑到cvT的转换函数,从而实现了对CWG2327的修复。

C::operator A()本身被视为候选对象时,它是一个精确匹配,因此优先于需要用户定义转换的构造函数调用。

这个问题还在起草阶段,所以你不会在措辞中找到这个。

明显拒绝-std=c++14

相关内容

  • 没有找到相关文章

最新更新