2015-06-20 102 views
1

请看看这段代码:为什么float参数适合int函数参数?

#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);构造。 何时允许编译器将一个参数类型转换为另一个参数以调用相应的构造函数?

+0

'当正好编译器允许convert'每次[当隐式转换是可能的,没有更好的方法]。 – deviantfan

+0

[此参考资料](http://en.cppreference.com/w/cpp/language/implicit_cast)列出标准转换。这里特别感兴趣的是浮点积分转换。 – chris

+0

另外,查看构造之间的区别,'A x(7)'和赋值,'x = 7;' –

回答

3

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

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

查找A(int)可用标准转换调用,编译器插入必要的步骤以使代码生效。这是相同的规则,允许int x = 1.1编译

如果这种行为是不可取的,你可以禁止它的=delete

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

'= delete'的效果是什么? –

+0

'A(int)'被调用是因为它是原始代码中最好的匹配。如果有'A(double)',它会调用它。 '= delete'表示你不希望这个函数被调用 –

相关问题