如果你有这个功能
template<typename T> f(T&);
然后尝试用它来调用它,比如说一个右值
f(1);
为什么不直接将 T 推导出为 const int,使参数成为 const int& 从而可绑定到右值?
如果你有这个功能
template<typename T> f(T&);
然后尝试用它来调用它,比如说一个右值
f(1);
为什么不直接将 T 推导出为 const int,使参数成为 const int& 从而可绑定到右值?
我在最近的 C++0x 转发问题中链接的文档中提到了这是一个潜在的解决方案。
它会很好地工作,但它会破坏现有代码。考虑(直接来自文档):
template<class A1> void f(A1 & a1)
{
std::cout << 1 << std::endl;
}
void f(long const &)
{
std::cout << 2 << std::endl;
}
int main()
{
f(5); // prints 2 under the current rules, 1 after the change
int const n(5);
f(n); // 1 in both cases
}
或者
// helper function in a header
template<class T> void something(T & t) // #1
{
t.something();
}
// source
#include <vector>
void something(bool) // #2
{
}
int main()
{
std::vector<bool> v(5);
// resolves to #2 under the current rules, #1 after the change
something(v[0]);
}
这也无法转发值类别(左值或右值),这在 C++03 中不是什么大问题。但是由于这个修复只能在 C++0x 期间完成,所以我们在转发时会有效地将自己与右值引用隔离开来(一件坏事)。我们应该努力寻求更好的解决方案。
是的,但前提是您声明f
采取T const &
.
template <typename T> void f(T &);
template <typename T> void g(T const &);
void x() { f(1); } // error: invalid initialization of non-const reference
void y() { g(1); } // no error
如果你同时 f(T &)
声明and f(T const &)
,它会选择 const 限定的:
template <typename T> void f(T &);
template <typename T> void f(T const &);
void x() { f(1); } // no error, calls f(T const &)
现在也许你在说“在第一个例子中,为什么它会生成一个临时类型int
的调用来调用f
它本来可以生成一个临时类型const int
并使代码编译?” 我为您提供的最佳答案是,当参数不是整数常量时,这与重载解析行为不一致。