在C++中,在编译时在lambda中使用自定义类型的运算符

huangapple go评论70阅读模式
英文:

Using operators on a custom type in a lambda at compile time in C++

问题

我有一个类,我想在编译时执行操作。在下面的示例中,我有一个简单的结构体IntWrapper,其中重载了operator+。在任何正常情况下使用这个类似乎都没问题,但在lambda内部使用时会失败,为什么?

struct IntWrapper
{
	consteval IntWrapper operator+(const IntWrapper& other) const
	{
		return { x + other.x };
	}

	int x;
};

int main()
{
	// 正常情况下加法运算工作正常
	constexpr IntWrapper c1 = IntWrapper{ 1 } + IntWrapper{ 1 };

	auto adder = [](IntWrapper x) { return x + x; };

	// 在lambda内部使用加法不起作用
	constexpr IntWrapper c2 = adder(IntWrapper{ 1 });
}

如何使这个对象在lambda的上下文中在编译时工作?

英文:

I have a class which I'd like to perform operations on at compile time. In the example below I have a simple struct IntWrapper with an overloaded operator+. Using this class in any normal context seems to work fine, but it fails when used inside a lambda, why?

struct IntWrapper
{
	consteval IntWrapper operator+(const IntWrapper& other) const
	{
		return { x + other.x };
	}

	int x;
};

int main()
{
	// Adding normally works just fine
	constexpr IntWrapper c1 = IntWrapper{ 1 } + IntWrapper{ 1 };

	auto adder = [](IntWrapper x) { return x + x; };

	// Using a lambda to add doesn't work
	constexpr IntWrapper c2 = adder(IntWrapper{ 1 });
}

How can I get this object to work, at compile time, inside the context of a lambda?

答案1

得分: 5

使用旧的C++20规则,x + x作为x.operator+(x)必须是一个常量表达式,因为它调用了一个consteval函数,但它本身不在一个consteval函数内部。由于它使用了函数参数的值,它不能是一个常量表达式。

将其放在一个consteval函数内部:

auto adder = [](IntWrapper x) consteval { return x + x; };

这在P2564R3中已得到修复,因此遵循新规则的编译器(如clang 17)将在C++20模式下编译此代码。

英文:

Using the old C++20 rules, x + x being x.operator+(x) must be a constant expression, since it calls a consteval function but is not inside a consteval function itself. It can't be a constant expression since it uses the function argument's values.

Make it be inside a consteval function:

auto adder = [](IntWrapper x) consteval { return x + x; };

This is fixed with P2564R3 so a compiler following the new rules (like clang 17) will compile this, even in C++20 mode.

huangapple
  • 本文由 发表于 2023年6月13日 05:32:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/76460455.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定