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

Rim*_*imo 5 c++ templates const return-value

来自Herb Sutter的GotW#6

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

注意:Lakos(第618页)反对返回const值,并指出它对于内置函数来说是多余的(例如,返回"const int"),他注意到这可能会干扰模板实例化.

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

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

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

Jam*_*lis 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)"
}
Run Code Online (Sandbox Code Playgroud)

请注意,Visual C++ 2010 错误地接受这两者。Comeau 4.3.10 和 g++ 4.1.2 正确地不接受g(&f_const)调用。