函数得载 在C++中,为什么函数重载不基于返回类型?
,因为它是合法的忽略返回值,因此编译器不总是能够现实地决定调用哪个重载。< /P> 考虑函数得载 在C++中,为什么函数重载不基于返回类型?,c++,C++,,因为它是合法的忽略返回值,因此编译器不总是能够现实地决定调用哪个重载。< /P> 考虑 void foo(); int foo(); long foo(); ... foo(); // which function to call here??? 但是,即使指定了返回值,当需要转换时,也可能无法在等效重载之间进行选择: double d = foo(); // and here??? 因为忽略返回值是合法的,因此编译器并不总是能够实际地决定调用哪个重载 考虑 void foo(); in
void foo();
int foo();
long foo();
...
foo(); // which function to call here???
但是,即使指定了返回值,当需要转换时,也可能无法在等效重载之间进行选择:
double d = foo(); // and here???
因为忽略返回值是合法的,因此编译器并不总是能够实际地决定调用哪个重载 考虑
void foo();
int foo();
long foo();
...
foo(); // which function to call here???
但是,即使指定了返回值,当需要转换时,也可能无法在等效重载之间进行选择:
double d = foo(); // and here???
因为编译器不总是能够决定选择哪个函数。因为编译器不总是能够决定选择哪个函数。考虑以下情况:
double Fun()
{
}
int Fun()
{
}
由于不强制指定函数的返回值,因此对Fun()
的调用将是不明确的,因为编译器不知道调用哪个Fun()
。考虑以下情况:
double Fun()
{
}
int Fun()
{
}
因为从函数中分配返回值不是强制的,所以调用“<代码> Fun](/Cuffe)将是不明确的,因为编译器不知道哪个代码> >()/代码>要调用.< /P> < P>,因为C++有或多或少的隐式转换。 大多数情况下不可能,例如:
int f();
char f();
double d = f();
可以对某些返回类型模拟重载
时间,通过使用代理对象:
int doFInt();
char doFChar();
struct Proxy
{
template<typename T> operator T() const
{
return static_cast<T>(doFInt());
}
};
template<>
Proxy::operator char() const { return doFChar(); }
Proxy f();
double d = f(); // Calls doFInt().
int-doFInt();
char doFChar();
结构代理
{
模板运算符T()常量
{
返回静态_cast(doFInt());
}
};
样板
Proxy::operator char()const{return doFChar();}
代理f();
双d=f();//调用doFInt()。
然而,像这样值得费心的事情只有一次是
当它可以真正通用时;类似于getAttribute的东西
函数,其中属性始终存储为字符串
该函数的一般形式使用boost::lexical_cast转换为
目标类型:,因为C++有或多或少的隐式转换。 大多数情况下不可能,例如:
int f();
char f();
double d = f();
可以对某些返回类型模拟重载
时间,通过使用代理对象:
int doFInt();
char doFChar();
struct Proxy
{
template<typename T> operator T() const
{
return static_cast<T>(doFInt());
}
};
template<>
Proxy::operator char() const { return doFChar(); }
Proxy f();
double d = f(); // Calls doFInt().
int-doFInt();
char doFChar();
结构代理
{
模板运算符T()常量
{
返回静态_cast(doFInt());
}
};
样板
Proxy::operator char()const{return doFChar();}
代理f();
双d=f();//调用doFInt()。
然而,像这样值得费心的事情只有一次是
当它可以真正通用时;类似于getAttribute的东西
函数,其中属性始终存储为字符串
该函数的一般形式使用boost::lexical_cast转换为
目标类型。调用函数时,不涉及其返回类型。因此,使用不同的返回类型实现函数重载是没有意义的。调用函数时,不涉及其返回类型。因此,用不同的返回类型实现函数重载是毫无意义的。即使存储每个返回值:如果有一个包含多个构造函数的类型可用于转换,则可能会出现不明确的情况。我强烈要求对任何答案投反对票,因为编译器不能总是这样选择编译器不能总是在重载函数之间进行选择,而这正是产生错误的原因。-更好的答案是,这将意味着非常复杂的规则,或者提供制造混乱的方法,如果您真的愿意,可以使用转换运算符来实现。@UncleBens,很公平,假设编译器无法在很大一部分(可能接近大多数)情况下进行选择,因为返回值经常被忽略,这比函数参数/转换上的不明确重载要频繁得多。如果函数在返回类型上重载,这很可能意味着结果很重要。有些函数通常不会忽略结果,如果忽略了,则很可能是编码人员的错误,例如,
boost::lexical_cast(str)
-然而,确实会有很多情况需要明确地消除歧义,并且用例会非常有限。所以不值得让每个人都陷入混乱。即使你存储每个返回值:如果有一个包含多个构造函数的类型可以用于转换,那么可能会出现不明确的情况。我强烈要求对任何答案进行否决,因为编译器不能总是选择。编译器不能总是在重载函数之间进行选择,而这正是产生错误的原因。-更好的答案是,这将意味着非常复杂的规则,或者提供制造混乱的方法,如果您真的愿意,可以使用转换运算符来实现。@UncleBens,很公平,假设编译器无法在很大一部分(可能接近大多数)情况下进行选择,因为返回值经常被忽略,这比函数参数/转换上的不明确重载要频繁得多。如果函数在返回类型上重载,这很可能意味着结果很重要。有些函数通常不会忽略结果,如果忽略了,则很可能是编码人员的错误,例如,boost::lexical_cast(str)
-然而,确实会有很多情况需要明确地消除歧义,并且用例会非常有限。所以不值得让每个人都陷入混乱。我认为这不是一个很好的解释;对于函数参数也可以这样说<代码>void f(int){}void f(char){};f(0.0)与您的示例具有相同的问题,但在语法上是允许的。确定