【发布时间】:2021-10-17 01:25:37
【问题描述】:
#include <type_traits>
template<typename T, typename... Args_>
concept IsCallable = std::is_invocable_v<T, Args_...>;
struct A
{
int n = 0;
void f(IsCallable<int&> auto const fn)
{
fn(n);
}
void f(IsCallable<int const&> auto const fn) const
{
fn(n);
}
};
struct Lambda
{
void operator()(auto& n) const
{
n = 1;
}
};
int main()
{
auto a = A{};
a.f(Lambda{}); // ok
a.f([](auto& n) { n = 1; }); // error: assignment of read-only reference 'n'
}
为什么 C++ lambda 重载的行为不符合预期?
【问题讨论】:
-
似乎由于某种原因,重载决议希望它成为
const函数,而auto&被推导出为int const&,尽管值发生了变化。将其更改为int&可以修复它,但仍然很奇怪,尤其是在上面的行中。有了概念就可以避免这种情况
标签: c++ lambda overloading standards c++20