复制构造函数显式在c ++中使编译错误。谁负责施法?

问题描述 投票:-1回答:2

我的Clion IDE向我显示,当我将const double*类型转换为具有参数const A的函数时,可能存在问题,当A使用双数组定义时,如下所示。

A的第二个构造函数是显式时,存在编译错误,但是当A的第二个构造函数不明确时,一切正常。我认为应该从const double*const A铸造,但我不确定。然后我调试了代码,我看到只调用了A的第一个构造函数。

那么,为什么第二个构造函数不是明确的呢?

class A {
public:
friend class B;
private:
    A(double v1, double v2): _x{v1, v2}{}
    explicit A(const double *arr2): _x{*arr2, *(arr2+1)}{}
    double _x[2];

};
class B {
private:
    A _b1, _b2;
    static double foo(const A &first, const A &second){
        return first._x[0]*second._x[1];
    }
public:
    B(): _b1(2.1, 2.2), _b2(1.2, 1.1){}
    B(double List[2][2]): _b1(List[0][0],List[0][1]), _b2(List[1][0], List[1][1]) 
  {}
    void Problem( const double* bArr, double* result) const{
        double goesTo=thisfunc();

        *result =foo(bArr, _b1)/goesTo; //this is where Clion states a possible problem
    }
    double thisfunc() const{

        return foo(_b1, _b2);
    }
};
int main() {
    double initArray[][2]={{2,1},{1,1}};
    B M(initArray);
    return 0;
} 
c++ casting explicit
2个回答
1
投票

看起来你正在将指针bArr传递给引用参数。您可能希望首先取消引用指针:

*result =foo(*bArr, _b1)/goesTo;

此外,我99%肯定这正是错误消息所指出的。

回答你的问题。从指针到引用没有隐式转换(转换)。您必须明确使用dereference运算符--prefixed*。复制构造函数不是构造函数,也不是构造函数。

T中的强制转换运算符从T转换为其他类型。复制构造函数将T的一个实例复制到另一个T实例。具有一个其他类型的参数的普通构造函数可以被视为将所述其他类型转换为类型为T的实例。

编辑:正如Pete Becker指出的那样,这并没有解决问题,因为explicit A(const double *arr2)被标记为显式,从而禁止编译器执行允许它执行的一次隐式转换。所以正确的解决方案是直接从A创建bArr或将其标记为隐式


2
投票

问题中的代码很复杂,但问题很简单。

void f(const A&);
double data[] = { 1.0, 2.0 };
f(data); // error

A(const double*)被标记为explicit时,编译器不允许使用它来隐式地将data转换为A类型的对象。为了使用该构造函数,代码必须具有显式转换:

f(static_cast<A>(data));

毕竟,这就是explicit的意思。

© www.soinside.com 2019 - 2024. All rights reserved.