我怀疑这种方法是否可行,假设你想要两种方法同时调用一个函数,一种是返回一个对象而另一种是通过引用返回参数:
// ...
template <class T> void func(Foo<T>& f, const T n)
{
f.a = Something(f.a + n);
f.b = Something(f.b + n);
}
template <class T> Foo<T> func(const Foo<T>& f, const T n)
{
return Foo<T>( Something(f.a + n), Something(f.b + n) );
}
// ...
// main
Foo<int> foo(1, 1);
func(foo, 2);
Foo<int> foo2 = func(foo, 2);
第一个参数中的const字是否会影响方法的签名?
答案 0 :(得分:5)
是的。 const
会影响签名,返回类型则不会。
有关参与重载的函数的信息 resolution(13.3):它的参数类型列表(8.3.5),如果是 function是一个类成员,函数上的cv-qualifiers(如果有的话) 本身和声明成员函数的类。 [...]
const
是hte parameter-type-list的一部分,因此它确定了一个重载。
答案 1 :(得分:3)
是的,对const
的引用是对非const
的引用的单独类型,因此带有这些参数的两个函数是单独的重载。
然而,这不起作用:
Foo<int> foo2 = func(foo, 2);
由于foo
不是const
,这将选择非const
重载,它没有返回值;所以作业将失败。您需要明确选择const
版本:
Foo<int> foo2 = func(static_cast<const Foo<T>&>(foo), 2);