小编Hi *_* SO的帖子

将重载的 CRTP 类成员方法传递给 lambda

考虑一下:

template<typename T>
struct base_t
{
    auto& f(int x) { return (T&)*this; }
    auto& f(char x) { return (T&)*this; }
};

struct derived_t : base_t<derived_t>
{

};

void test()
{
    derived_t instance;

    auto lambda = [&](derived_t&(derived_t::*g)(char))
    {
        (instance.*g)('a');

        //instance.f('a');
    };

    lambda(&derived_t::f);
}
Run Code Online (Sandbox Code Playgroud)

没有在该特定行 ( //instance.f('a');) 中发表评论,我收到以下错误 (MSVC 2019):

error C2664: 'void test::<lambda_1>::operator ()(derived_t &(__cdecl derived_t::* )(char)) const': cannot convert argument 1 from 'overloaded-function' to 'derived_t &(__cdecl derived_t::* )(char)'
Run Code Online (Sandbox Code Playgroud)

当该行没有被注释掉时,它编译得很好。

为什么引用finsidelambda神奇地允许编译器转换这个重载函数?

此外,如果没有 CRTP,这根本不会发生。

编辑:此外,正如@Jarod42 所指出的,

  • 明确返回类型 …

c++ lambda overloading crtp c++17

10
推荐指数
1
解决办法
313
查看次数

什么是 JKZD 和 JKNZD?

浏览 Zydis(https://github.com/zyantific/zydis/blob/57be5b1d1b9dd99830b89caac928add64ad5d072/include/Zydis/Generated/EnumMnemonic.h)助记符我发现了这些:

ZYDIS_MNEMONIC_JKNZD,
ZYDIS_MNEMONIC_JKZD,
Run Code Online (Sandbox Code Playgroud)

我在其他任何地方都找不到这些助记符;它们代表什么指令?

这些指令执行什么操作?

ZandNZ可能分别表示零和不为零,并且J可能代表跳跃,但是KD

编辑:我找到了这个旧的英特尔文档,但没有任何意义:

http://www.cism.ucl.ac.be/Services/Formations/ICS/ics_2013.0.028/vtune_amplifier_xe/documentation/en/instructions/327364001EN.pdf

它指出(第 75 页)JKZD 被编码为 VEX.NDS.128.0F.W0 84 id。

x86 assembly x86-64 disassembly xeon-phi

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

--list.begin() == list.end() 吗?

标准是否保证

--list.begin() == list.end()

总是成立并且它实际上是一个有效的操作?(list是 的一个实例std::list)。

至少 MSVC 2019 似乎就是这种情况。

例如,这在以下情况下会很有用:

for ( auto i = list.begin(); i != list.end(); ++i )
{
  ...
  list.erase(i--);
  ...
}
Run Code Online (Sandbox Code Playgroud)

,即在迭代时删除元素时,因为i可能是列表的开头。这也需要++list.end() == list.begin()持有;那个怎么样?

c++ iteration iterator stdlist language-lawyer

0
推荐指数
1
解决办法
279
查看次数