【发布时间】:2020-01-08 15:34:17
【问题描述】:
我知道 lambda 的类型是“隐藏的”并且是唯一的。但是“唯一”的确切含义是什么,相同的 lambda 代码是否给出相同的类型?
(如果可能)我想使用这个“不变量”进行类型检查,如下所示:
#include <type_traits>
template <typename T>
auto foo(const T y)
{
return [=](T x) { return x * y; };
}
int main()
{
auto f1 = foo<int>(4.);
auto f2 = foo<int>(6.); // fails with auto f2 = foo<double>(6.);
static_assert(std::is_same_v<decltype(f1),
decltype(f2)>); // is this ok or undefined behavior?
}
在此之前,我想确定 c++ 标准是怎么说的:它是正常的还是未定义的行为?
(这段代码被g++和clang++编译成功,但只是标准真题)
作为补充更符合最初的标题(抱歉,这有点晚了,因为我不得不离开我的办公室),这是一个更强大的版本,不编译:
#include <type_traits>
template <typename T>
auto foo_1(const T y)
{
return [=](T x) { return x * y; };
}
template <typename T>
auto foo_2(const T y)
{
return [=](T x) { return x * y; };
}
int main()
{
auto f1 = foo_1<int>(4.);
auto f2 = foo_2<int>(6.);
static_assert(std::is_same_v<decltype(f1), decltype(f2)>); // fails!
}
【问题讨论】:
-
嗯,看起来
foo<int>是一个函数,一个函数具有特定的返回类型。所以它返回的每个对象都需要具有相同的类型。我怀疑由于这个原因f1和f2必然具有相同的类型。 -
@FrançoisAndrieux 这句话很有趣,谢谢。
-
对于它的价值,here 是标准对闭包类型的规定。
-
恕我直言,标题与问题正文不匹配。您没有相同的 lambda 表达式,您有 一个 lambda(表达式
[...](...){...}出现一次)(更准确地说,每个模板实例化都有一个,但这里只有一个实例化)。跨度> -
仅根据问题标题,this example 可能会回答该问题。我尝试过的编译器并不认为相同的 lambda 具有相同的类型。
标签: c++ lambda language-lawyer