Bri*_*ian 7 c++ overload-resolution c++17
以下程序:
#include <iostream>
struct A
{
A() { std::cout << "A()\n"; }
A(int) { std::cout << "A(int)\n"; }
};
struct C {
operator int() {
std::cout << "operator int\n";
return 42;
}
operator A() {
std::cout << "operator A\n";
return A();
}
};
int main() {
auto a = A{C{}};
};
Run Code Online (Sandbox Code Playgroud)
编译并在运行时打印:
operator A
A()
Run Code Online (Sandbox Code Playgroud)
请参阅Godbolt 链接。
这表明选择了 的移动构造函数A来执行初始化,C::operator A()并被调用以转换C为移动构造函数期望的类型。
或者,A::A(int)构造函数可能已被选中C::operator int()并被调用。但A::A(int)显然失去了重载分辨率。
为什么会发生这种情况?我无法在标准中看到任何解释为什么移动构造函数A赢得重载决议的规则。
(这个问题受到这个答案的启发;我不明白为什么那个答案中的代码有效。)
看来 GCC 和 Clang 都通过在初始化cv2 T类型的对象时直接考虑将cv T 的转换函数作为候选函数以及构造函数来实现对CWG2327的修复。
当C::operator A()本身被视为候选者时,它是完全匹配的,因此优先于需要用户定义转换的构造函数调用。
该问题仍处于起草状态,因此您不会在措辞中找到这一点。
值得注意的是,两者都拒绝-std=c++14。