没有clang警告或错误,如果C 11 lambda返回错误类型

没有clang警告或错误,如果C 11 lambda返回错误类型,第1张

概述参见英文答案 > Using `std::function<void(…)>` to call non-void function                                    3个 看起来我的clang编译器(3.3)不会产生任何错误,如果lambda的返回类型不匹配: #include <functional>typedef std::function<void()> 参见英文答案 > 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 argumentvoID 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 longshort b = f(i); // call signature is short(int)                // called with int,returning into a short
总结

以上是内存溢出为你收集整理的没有clang警告或错误,如果C 11 lambda返回错误类型全部内容,希望文章能够帮你解决没有clang警告或错误,如果C 11 lambda返回错误类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216144.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存