转换运算符在以下代码中的行为方式存在问题:
struct A{
A(){};
A(const A &) = delete;
};
struct B : A{
B(const B & x){};
B(int x){};
};
struct C{
operator B() {
return B(1);
};
};
void foo(const A & x){
};
int main(){
C c;
foo(c.operator B()); //1) Ok
foo(c); //2) Not Ok
return 0;
};
我在通话 2) 中收到错误:
test.cpp:24:7: error: use of deleted function 'A::A(const A&)'
foo(c); //2) Not Ok
^
所以问题是:它到底为什么要复制初始化A?注意,B 声明了它自己的复制构造函数。我认为成功的调用 1) 与 2) 相同,但显然不是?
关于我正在尝试解决的实际问题:CI 类中想要提供到第三方 A 类的转换,该类禁止复制。这个想法是返回一个代理 B : A ,它将在 A 之上添加移动语义。是否有另一种方法来定义转换运算符以在遵守其非复制策略的同时将 A 放入堆栈。