【发布时间】:2014-06-04 16:42:01
【问题描述】:
以下代码可以正常工作,并且可以按预期找到重载:
struct HasBuzz
{
void buzz() const {}
};
struct NoBuzz {};
template <typename T>
void foo(T const& t)
{
t.buzz();
}
void foo(NoBuzz const&){}
int main()
{
foo(HasBuzz{});
foo(NoBuzz{});
}
但是,如果我将第一个重载替换为“通用参考”版本,则它不再起作用。未找到 NoBuzz 的正确重载。
struct HasBuzz
{
void buzz() const {}
};
struct NoBuzz {};
template <typename T>
void foo(T&& t)
{
t.buzz();
}
void foo(NoBuzz const&){}
int main()
{
foo(HasBuzz{});
foo(NoBuzz{}); // error: NoBuzz has no member function buzz
}
我该怎么做才能让它发挥作用?
【问题讨论】:
-
重载分辨率与函数的“胆量”无关。
-
@juanchopanza:啊,是的,我误解了第一种情况下选择重载的原因。但问题仍然存在。
-
void foo(T&& t)比将临时值绑定到 const 引用void foo(NoBuzz const&)更好,因此编译器将使用右值引用函数。我有类似的问题,请参阅stackoverflow.com/questions/24029213/… -
我认为您的基本问题的答案是
std::enable_if(en.cppreference.com/w/cpp/types/enable_if)。