【问题标题】:Why does float argument fit to int function parameter?为什么 float 参数适合 int 函数参数?
【发布时间】:2015-09-06 14:15:12
【问题描述】:

请看这段代码:

#include <iostream>
class A {
  public:
    int my;
    A(int a=0) : my(a) { }
};

int main() {
  A x = 7; // 1
  A y = 6.7; // 2
  std::cout << x.my << " " << y.my << "\n";
}

虽然没有 A(double a); 构造函数,但它实际上可以编译。 究竟什么时候允许编译器将一种参数类型转换为另一种来调用相应的构造函数?

【问题讨论】:

  • When exactly compiler is allowed to convert 每次[当隐式转换是可能的并且没有更好的方法时]。
  • This reference 列出标准转换。这里特别感兴趣的是浮点积分转换。
  • 另外,查看构造A x(7)和赋值x = 7;之间的区别

标签: c++ constructor type-conversion


【解决方案1】:

cppreference 有a list 的标准转换。您感兴趣的是 浮动 - 积分转换 部分,也可以在 N4140 4.9/1

中找到

浮点类型的纯右值可以转换为任何整数类型的纯右值。小数部分被截断,即小数部分被丢弃。

发现A(int) 可通过标准转换调用,编译器插入必要的步骤以使代码工作。允许int x = 1.1编译的规则是一样的

如果这种行为不受欢迎,您可以使用 =delete 禁止它

class A {
  public:
    //...
    A(int a);
    A(double) =delete;
};    

【讨论】:

  • =delete的作用是什么?
  • A(int) 被调用是因为它是原始代码中的最佳匹配。如果有A(double),它会改为调用它。 =delete 表示您不希望该函数可调用
猜你喜欢
  • 1970-01-01
  • 2011-07-25
  • 2019-03-11
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多