如何启用显式重载构造函数的复制初始化?

问题描述:

我认为赚钱重载的构造explicit防止拷贝初始化,如果我这样做需要它explicit我怎样才能使拷贝初始化为下面的类如何启用显式重载构造函数的复制初始化?

class real { 
public: 
    explicit real(const double& value) : x(value) {} 
    real(const real& other) : x(other.x) {} 
    ~real() = default; 

    real& operator= (const double& rhs) { 
     this->x = rhs; 
     return *this; 
    } 

    operator double() { 
     return this->x; 
    } 
private: 
    double x; 
}; 

int main(){ 

    real r1 = 3.4; // Error 
    real r2 = (real) 3.4; // Ok : is this the only way ? 

    return 0; 
} 

这是不好的C++:

real r2 = (real) 3.4; 

你想要的是:

real r2(3.4); 

这是传递参数的常用方法到C++中的构造函数。这就是人们在阅读代码时期望看到的内容。

如果你有,你需要分配的情况下,你可以这样做:

r2 = real(3.4); 
+1

你的意思是我通过调用创建临时对象,而不是铸造拷贝构造函数...这是很好的方式不知道我是怎么错过了这个......但我认为我可以做直接分配(复制初始化)而不需要创建临时对象。 – Laith

+0

对。无论如何,我认为不会对优化编译器产生不利的性能影响。 –