2011-11-17 164 views
6

可能重复:
List of C++ name resolution (and overloading) rules函数重载在C++

什么是编译器如何决定哪些功能要在C++的规则? (这是给定的两个函数具有相同的名称 - 编译器如何选择/优先考虑另一个函数,主要是想知道编译器选择何种类型的编译器时更愿意执行)

+1

你的意思是压倒一切吗? – MGZero

+2

规则很多...并且很复杂。所有这些都在C++标准的** 3.4 **部分中涵盖了。 –

+0

@MGZero - no ... – Belgi

回答

4

如前所述,规范在标准中有完整的描述。作为一个基本的经验法则,编译器将选择需要最少自动转换的重载,但要注意的是它永远不会应用2个用户定义的转换。

整数类型会自动转换很多。因此,如果您的函数在intdouble上超载,则编译将选择int函数(如果使用一个整数常量调用)。如果您没有int版本,编译器会选择double之一。在各种整数类型中,编译器更喜欢整数常量为int,因为这是它们的类型。如果您在shortunsigned short上超载,但调用常量为5,则编译器会抱怨说无法确定要使用哪个超载。

Scott Meyers的书确实有我读过的最好的解释。

+0

“Scott Meyers的书”。你可以通过命名书名来更具体吗? –

+0

对于我的生活,我现在找不到它。 +1给参考的任何人? – drdwilcox

+0

Scott Meyers的书:http://www.aristeia.com/books.html;该参考可能是有效的C++或可能更有效的C++。 – pnkfelix

0

整个函数名称由您称之为函数以及参数列表组成。因此,从逻辑上讲,两个称为同一事物但具有不同参数列表的函数都有不同的“全名”。我的术语可能有点偏离,所以如果有人想纠正这个问题,请随意。

+1

说你有doSomething(int x)和doSomething(short x),当你调用doSomething(5)时编译器会选择哪一个? – Tom

+0

啊,这让它更有趣!好的问题,也超出了我的知识范围。我觉得这取决于编译器认为5是什么。我倾向于说int,但我不确定。 – MGZero

+1

它会选择'int'版本。 – drdwilcox

0

它基于参数的类型。如果类型不匹配,则不涉及投射,只是不会编译。

+0

查看我对MGZero的帖子的评论 – Tom

+0

对于我所知道的,如果你有void f(double x),并且你打电话给f(5),那么comiles和5被铸造成5.0 – Belgi