const返回类型何时干扰模板实例化?

时间:2010-05-28 02:29:33

标签: c++ templates const return-value

来自Herb Sutter的GotW #6

  

对于非内置返回类型,返回值通常应为const。 ...

     

注意:Lakos(第618页)反对返回const值,   并指出无论如何它对于内置者来说是多余的   (例如,返回“const int”),他注意到了   干扰模板实例化。

虽然Sutter似乎不同意在使用Lakos按值返回非构建类型的对象时是返回const值还是非const值,但他通常同意返回内置类型的const值(例如const int)不是一个好主意。

虽然我理解为什么这是无用的,因为返回值不能被修改,因为它是一个右值,我找不到一个如何干扰模板实例化的例子。

请举例说明如何使用返回类型的const限定符可能会干扰模板实例化。

1 个答案:

答案 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)调用。