【问题标题】:When does a const return type interfere with template instantiation?const 返回类型何时会干扰模板实例化?
【发布时间】:2010-05-28 02:29:33
【问题描述】:
来自 Herb Sutter 的 GotW #6
对于非内置返回类型,按值返回通常应该是 const。 ...
注意:Lakos(第 618 页)反对返回 const 值,
并指出无论如何它对于内置程序都是多余的
(例如,返回“const int”),他指出这可能
干扰模板实例化。
虽然 Sutter 在使用 Lakos 按值返回非内置类型的对象时似乎不同意返回 const 值还是非常量值,但他通常同意返回内置类型的 const 值 (例如 const int) 不是一个好主意。
虽然我理解为什么这是无用的,因为返回值是右值,因此无法修改,但我找不到如何干扰模板实例化的示例。
请给我一个例子,说明返回类型的 const 限定符如何干扰模板实例化。
【问题讨论】:
标签:
c++
templates
constants
return-value
【解决方案1】:
这是一个涉及函数指针的简单示例:
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) 调用。