使用 Assignment 进行显式转换

Explicit conversion with Assignment

提问人:phy nju 提问时间:1/7/2018 最后编辑:phy nju 更新时间:1/7/2018 访问量:174

问:

具有显式转换构造函数的简单类。

class MyDouble {
    double d;
public:
    MyDouble() : d(0) {}
    explicit MyDouble(double d_) : d(d_) {}
    MyDouble & operator =(double d_) {
        d = d_; return *this;
    }
};

我特意添加一个赋值,使其可以赋值构造自 。double

MyDouble a; 
a = 1.1;                    // this works
MyDouble b = MyDouble(1.1); // this works
MyDouble c(1.1);            // this works
MyDouble d = 1.1;           // this does not work 

我不想要隐式转换,因为它会导致一些其他问题。但我仍然想要直接分配工作,但它没有。无论如何,是否可以在不删除关键字的情况下使最后一个语句起作用。MyDouble d = 1.1;explicit

C++ 构造函数 Assignment-Operator 显式转换

评论

1赞 AnT stands with Russia 1/7/2018
代码中唯一的赋值是 。其余的不是分配。“我不想要隐性皈依”......但显然是试图进行隐式转换!a = 1.1;MyDouble d = 1.1;
1赞 Davis Herring 1/7/2018
“显式转换构造函数”是一个矛盾的词:构造函数正在转换,而不是。explicit
0赞 phy nju 1/7/2018
MyDouble d = 1.1;这是否可以解释为构造一个新对象并将其分配为数字。d1.1
0赞 chris 1/7/2018
考虑到除非在语言中出现新的特殊情况,否则这将允许编译。vector<int> v = 5;
1赞 Davis Herring 1/7/2018
@phynju:否:初始化不是赋值。

答:

0赞 SoronelHaetir 1/7/2018 #1

你的问题的答案是“否”,没有办法允许 MyDouble d = 1。而不删除显式。

您可以简单地使用 MyDouble d(1.);或者 MyDouble d{1.};而不是使用赋值初始化。这将允许您保留显式内容,同时明确您正在初始化。

评论

0赞 juanchopanza 1/7/2018
吹毛求疵:它是复制初始化,而不是赋值初始化