没有clang警告或错误,如果C 11 lambda返回错误类型
发布时间:2020-12-16 09:53:28 所属栏目:百科 来源:网络整理
导读:参见英文答案 Using `std::functionvoid(…)` to call non-void function????????????????????????????????????3个 看起来我的clang编译器(3.3)不会产生任何错误,如果lambda的返回类型不匹配: #include functionaltypedef std::functionvoid() voidFunc;voi
参见英文答案 >
Using `std::function<void(…)>` to call non-void function????????????????????????????????????3个
看起来我的clang编译器(3.3)不会产生任何错误,如果lambda的返回类型不匹配: #include <functional> typedef std::function<void()> voidFunc; void foo(voidFunc func) { func(); } int main() { int i = 42; foo([i]() { return i; }); return 0; } 编译此代码不会显示任何错误: clang++ -c -Xclang -stdlib=libc++ -std=c++11 -Weverything -Wno-c++98-compat -Wno-missing-prototypes -o foo.o foo.cpp 如何为此类问题生成类型错误? 编辑: 这会生成类型错误: #include <functional> struct A {}; struct B {}; typedef std::function<A()> aFunc; void foo(aFunc func) { func(); } int main() { int i = 42; foo([i]() { return B(); }); return 0; } 这是错误: foo2.cpp:16:2: error: no matching function for call to 'foo' foo([i]() { ^~~ foo2.cpp:8:6: note: candidate function not viable: no known conversion from '<lambda at foo2.cpp:16:6>' to 'aFunc' (aka 'function<A ()>') for 1st argument void foo(aFunc func) ^ 1 error generated. 解决方法
std :: function是支持特定调用签名?的可调用对象的多态容器.
可以像调用void()函数一样调用示例中的lambda;忽略返回值从来都不是C中的类型错误(这是一个好的或坏的想法是一个不同的问题). 因此,std :: function< void()>允许这样的对象.显示的第一个程序完全有效. 但是,第二个程序中的lambda不能在A()函数的任何地方调用: void f(A const&); f(the_lambda()); // nope! 所以第二个程序无效,编译器正确报告. 如果您想在这种情况下出现类型错误,则需要进行自己的类型检查.在这种情况下,你可以简单地static_assert,std :: result_of< T()> :: type与void相同.但是,一般情况下,这是不可能的,因为在C中,所有可调用的对象(除了像void()这样的退化对象都有多个可能的调用签名,这要归功于隐式转换等功能. ?我可能要在这里通过“呼叫签名”来解释我的意思.我指的是实际调用中使用的类型,或者可能是返回值的调用赋值,而不是声明的签名中明确存在的类型.请考虑以下代码. long f(double); double d; int i; long a = f(d); // call signature is long(double) // called with double,returning into a long short b = f(i); // call signature is short(int) // called with int,returning into a short (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |