相关疑难解决方法(0)

Lambda Expression vs Functor in C++

我想知道在C++中我们应该在functor中使用lambda表达式.对我来说,这两种技术基本相同,甚至算法也比lambda更优雅,更清洁.例如,如果我想重用我的谓词,我必须一遍又一遍地复制lambda部分.所以lambda什么时候真正进入?

c++ lambda

39
推荐指数
4
解决办法
2万
查看次数

为什么lambda表达式在未评估的操作数中不允许,但在常量表达式的未评估部分中允许?

如果我们看看草案C++标准部分5.1.2 Lambda表达式2段说(强调我的未来):

lambda表达式的评估导致prvalue临时(12.2).这个临时对象称为闭包对象.lambda表达式不应出现在未评估的操作数中(第5条).[注意:闭包对象的行为类似于函数对象(20.8).-结束注释]

和部分5.19 常量表达式2段说:

条件表达式是核心常量表达式,除非它涉及以下之一作为潜在评估的子表达式(3.2),但是未评估的逻辑AND(5.14),逻辑OR(5.15)和条件(5.16)操作的子表达式不被视为 [...]

并有以下子弹:

- lambda表达式(5.1.2);

那么为什么lambda表达式不允许在未评估的操作数中,但是在常量表达式的未评估部分中是允许的?

我可以看到,对于未评估的操作数,在几种情况下(decltypetypeid)的类型信息不是很有用,因为每个lambda都有一个唯一的类型.虽然为什么我们想要让它们在未经评估的不断表达的背景下不明确,或许是为了让SFINAE

c++ lambda constant-expression c++11 c++14

14
推荐指数
1
解决办法
6355
查看次数

在std :: greater和std :: less上的C++ 11条件表达式得到了不同类型的错误

以下与条件表达式相关的代码:

typedef unsigned char uchar;
uchar data[100];
// assign something to array[] here
uchar *start = data;
uchar *end = data+100;
bool cond = f();  // f() could return true or false
uchar *itr = std::upper_bound(start, end, uchar(20), 
                cond? std::greater<uchar>() : std::less<uchar>());
Run Code Online (Sandbox Code Playgroud)

得到这样的错误:

error: operands to ?: have different types 
‘std::greater<unsigned char>’ and ‘std::less<unsigned char>’
Run Code Online (Sandbox Code Playgroud)

这是编译器错误吗?根据我的直觉,这两个仿函数应该具有相同的类型.

c++ c++11

8
推荐指数
2
解决办法
363
查看次数

将SFINAE与通用lambda一起使用

通用lambda可以利用"替换失败不是错误"规则吗?例

auto gL = 
    [](auto&& func, auto&& param1, auto&&... params) 
        -> enable_if_t< is_integral<
            std::decay_t<decltype(param1)>
        >::value>
    {
        // ...
    };

auto gL =  
     [](auto&& func, auto&& param1, auto&&... params) 
        -> enable_if_t< !is_integral<
            std::decay_t<decltype(param1)>
        >::value>
    {
        // ...
    };
Run Code Online (Sandbox Code Playgroud)

是否有任何变通方法或计划将其包含在语言中?此外,由于通用lambda是引擎盖下的模板化功能对象,这是不是有点奇怪,这是不能做到的?

c++ lambda sfinae generic-lambda c++14

5
推荐指数
1
解决办法
973
查看次数