我知道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çois Andrieux[...](...){...}
仅出现一次)(更准确地说,每个模板实例化都有一个,但这里只有一个实例化)。 - HolyBlackCattemplate <typename T, int DUMMY>
,并使用auto f1 = foo<int, 1>(4.);
和auto f2 = foo<int, 2>(6.);
... 这是否有所启示?还是与问题无关? - Eljay