来自Herb Sutter的GotW #6
对于非内置返回类型,返回值通常应为const。 ...
注意:Lakos(第618页)反对返回const值, 并指出无论如何它对于内置者来说是多余的 (例如,返回“const int”),他注意到了 干扰模板实例化。
虽然Sutter似乎不同意在使用Lakos按值返回非构建类型的对象时是返回const值还是非const值,但他通常同意返回内置类型的const值(例如const int)不是一个好主意。
虽然我理解为什么这是无用的,因为返回值不能被修改,因为它是一个右值,我找不到一个如何干扰模板实例化的例子。
请举例说明如何使用返回类型的const限定符可能会干扰模板实例化。
答案 0 :(得分:3)
这是一个涉及函数指针的简单示例:
const int f_const(int) { return 42; }
int f(int) { return 42; }
template <typename T>
void g(T(*)(T))
{
return;
}
int main()
{
g(&f_const); // doesn't work: function has type "const int (*)(int)"
g(&f); // works: function has type "int (*)(int)"
}
请注意,Visual C ++ 2010错误地接受了这两者。 Comeau 4.3.10和g ++ 4.1.2正确地不接受g(&f_const)
调用。