在不使用 option-Wpedantic的情况下,启用 c++11 的编译器允许在 lambda 表达式中使用默认值。
对于这样的表达式,您可以使用std::function指定所有参数类型的类型,包括默认指定的参数。
但是,当使用带有 auto 关键字的自动类型推断时,lambda 表达式采用特定类型,例如main()::<lambda(int)>,其中括号中的值是传递给表达式的参数的类型。并且这些值总是被指定,不管它们是否有默认值(这通常是合乎逻辑的)。
下面是一个代码示例。
#include <functional>
#include <iostream>
void f1(std::function<int()> lambda)
{
if (lambda)
{
std::cout << lambda() << std::endl;
}
}
void f2(std::function<int(int)> lambda)
{
if (lambda)
{
std::cout << lambda(1) << std::endl;
}
}
int main()
{
auto lambda1 = [](int a = 3) -> int
{
return a;
};
f1(lambda1);
f2(lambda1);
std::function<int()> lambda2 = []()
{
return 1;
};
std::function<int(int)> lambda3 = [](int a)
{
return a;
};
f1(lambda2);
//f2(lambda2); // Очевидно несоответствие типов
//f1(lambda3); // Очевидно несоответствие типов
f2(lambda3);
}
在代码示例中,类型main()::<lambda(int)>被强制转换为std::function<int()>. 我没有足够的知识来理解为什么编译器不会对类型不匹配发誓。请帮我解释一下。
以及相关问题。
我可以明确指定一种类型,比如自动推断的类型吗?
我可以告诉编译器不允许这种类型的转换吗?