使用赋值运算符而不是隐式构造函数

Use assignment operators instead of an implicit constructor

提问人:jakob 提问时间:5/5/2021 最后编辑:jakob 更新时间:5/5/2021 访问量:249

问:

在我的程序中,我尝试使用赋值来分配我的类的对象。我专门尝试调用赋值运算符而不是隐式构造函数(因此是关键字)。当我尝试编译时,我收到 C2440 编译器错误operator=explicit

class MyClass {
public:
    explicit MyClass(double x = 0.) :
        m_x(x) {
    }

    MyClass& operator = (const double& other) {
        m_x = other;

        /* do something special here */

        return *this;
    }
private:
    double m_x;
};

int main()
{
    MyClass my_class = 2.; // C2440

    return 0;
}

我猜编译器尝试隐式调用构造函数失败(因为)。有人有解决方法吗?explicit

C++ 构造函数 Implicit Assignment-Operator Explicit

评论

2赞 Ted Lyngmo 5/5/2021
会是一个可以接受的解决方案吗?MyClass my_class; my_class = 2.;
1赞 KamilCuk 5/5/2021
Does anyone have a fix?删除?有什么要解决的 - 一切都按预期工作 - 编译器失败的代码应该失败。你想如何解决它?explicit
2赞 ChrisMM 5/5/2021
MyClass my_class = 2.;或多或少等同于 ,但是,你说它在 中,这使得它无效。MyClass my_class(2.);explicit
0赞 Ted Lyngmo 5/5/2021
@ChrisMM 这是明确的,所以......把它作为答案 - 即使它不使用赋值运算符
0赞 Ben Voigt 5/5/2021
没有运算符,因此隐藏构造函数永远不会神奇地调用赋值运算符。根据 C++ 语法,这是一个具有复制初始化的变量定义。它不会仅仅因为你的构造函数被声明为显式而成为其他语法生成(尽管 C++ 具有有状态语法,所以事情可以以不同的方式解析,这个例子没有)MyClass my_class = 2;

答:

3赞 ChrisMM 5/5/2021 #1

MyClass my_class = 2.;或多或少等效于 ,但是,您将构造函数标记为 ,这会阻止 C++ 自动执行此操作。MyClass my_class(2.);explicit

所以,在你编写代码的方式中,你不能真正做你想做的事。可以使用以下命令显式调用构造函数:

MyClass my_class(2.); // Explcitly call your constructor

或者,正如 Ted Lyngmo 在评论中提到的,您可以这样做:

MyClass my_class; // Call your constructor with default argument of 0
my_class = 2.; // then call your assignment operator