【问题标题】:Explicit conversion with Assignment使用赋值显式转换
【发布时间】:2018-06-16 12:49:37
【问题描述】:

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

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 

我不想要隐式转换,因为它会导致一些其他问题。但我仍然想要直接分配工作,但它没有。有没有办法在不删除 explicit 关键字的情况下使最后一条语句 MyDouble d = 1.1; 工作。

【问题讨论】:

  • 代码中唯一的assignmenta = 1.1;。其余的不是赋值。 “我不想要隐式转换”...但是MyDouble d = 1.1; 显然是在尝试执行隐式转换!
  • “显式转换构造函数”是矛盾的:如果不是explicit,构造函数就是正在转换
  • MyDouble d = 1.1;这是否可以解释为构造一个新对象d并将其分配为数字1.1
  • 考虑到除非语言中出现新的特殊情况,否则vector<int> v = 5; 可以编译。
  • @phynju:否:初始化不是赋值。

标签: c++ constructor assignment-operator explicit-conversion


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-11-16
  • 2017-02-17
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多