gpt4 book ai didi

c++ - 如果参数不是引用,如何防止编译传递的 lambda

转载 作者:太空狗 更新时间:2023-10-29 20:33:14 24 4
gpt4 key购买 nike

在我的一个项目中,我使用了一个小的实用函数,它采用一个 Message 结构和一个 lambda 函数,它修改了这个消息结构。

现在,我无意中传递了一个没有必要引用 & 的 lambda。它可以完美编译,但没有提供所需的输出。

对于我来说,应该有以下两种行为之一:

  1. 忘记写auto&,但只写auto应该会导致编译错误
  2. 只写 auto 应该解释为 auto&

是否可以在缺少 & 的情况下阻止编译,或者更好地将 auto 自动解释为 auto&

#include <iostream>
#include <functional>
#include <boost/variant.hpp>

struct Message {
int x;
int y;
};

void changeMessage(Message& m, const std::function<void(Message&)>& messageModifier) {
std::cout << "Message before:" << m.x << " " << m.y << "\n";
messageModifier(m);
std::cout << "Message after:" << m.x << " " << m.y << "\n";
}

int main(int, char**) {
{
std::function<void(int&)> f = [](int&) {};
std::function<void(int)> g = [](int) {};
f = g; // This compiles.
}

{
std::function<void(int&)> f = [](int&) {};
std::function<void(int)> g = [](int) {};
//g = f; // This does not compile. Makes perfect sense.
}

Message m{ 10,20 };
{
changeMessage(m, [](auto m) { m.x++; m.y--; }); // User unintentionally forgot &! Can I prevent this from compilation?
std::cout << "Message outside: " << m.x << " " << m.y << "\n";
}
{
changeMessage(m, [](auto& m) { m.x++; m.y--; });
std::cout << "Message outside: " << m.x << " " << m.y << "\n";
}
}

最佳答案

防止按值传递Message(auto 本身永远不是引用)的一种方法是禁用复制构造:

struct Message {
Message() = default;
Message(const Message&) = delete;

int x;
int y;
};

@ L. F. 建议的另一种解决方案是检查 lambda 不接受右值:

template<class Fn>
void change_message(Message& m, Fn fn) {
static_assert(!std::is_invocable_v<Fn, Message&&>);
fn(m);
}

关于c++ - 如果参数不是引用,如何防止编译传递的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56492643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com