如何在 require 子句中使用 lamda 表达式作为常量主表达式?

问题描述 投票:0回答:2

我试图理解指定 C++ require 子句的不同方式。我需要一些更深入的理解,而不是指定约束的技术解决方案。

想一个模板函数:

template<typename T>
T func(T t) {
  return t;
}

可以添加一个简单但无用的 require 子句:

template<typename T>
requires true
T func(T t) {
  return t;
}

我可以这样调用这个函数:

foo(1);

据我了解https://en.cppreference.com/w/cpp/language/constraints#Requires_clauses我还可以使用常量 lambda 表达式,因为 lambda 表达式也是主要表达式(https:// en.cppreference.com/w/cpp/language/expressions#Primary_expressions)。

template<typename T>
requires [] { return  true; }
T func(T t) {
  return t;
}

使用 VS2019 / VS2022 中的 cl.exe 我收到类似于(翻译)的编译错误:

错误 C7607:原子约束必须是 Bool 类型的常量表达式...

我尝试使用

constexpr
但没有成功。

我做什么想要:

requires ([] { return  true; }())

c++ lambda c++20 requires-clause
2个回答
0
投票

lambda 表达式的类型是由编译器确定的类类型。 lambda 返回什么并不重要,除非您实际调用 lambda。

类类型不是布尔类型。由于标准要求

requires

 子句中的表达式是布尔类型的常量表达式。您可以将 lambda 表达式设为常量表达式,但不能将其设为布尔类型。


0
投票
如何在 require 子句中使用 lamda 表达式作为常量主表达式?

立即调用 lambda。

这是因为

[] { return true; }

 是某种编译器特定类型(也称为闭包类型)的对象,无法隐式转换为 
bool

因此,为了实现此目的,只需使用函数调用运算符

()

 来调用 lambda。 
演示

© www.soinside.com 2019 - 2024. All rights reserved.