什么';我的助推器有什么问题吗? 我认为菲尼克斯λ函数是C++ 11λ。因此,我尝试以下方法:

什么';我的助推器有什么问题吗? 我认为菲尼克斯λ函数是C++ 11λ。因此,我尝试以下方法:,c++,boost,lambda,boost-phoenix,C++,Boost,Lambda,Boost Phoenix,您不能仅在占位符(如_a)上调用成员,因为它们不声明成员(如字段)。相反,将它们绑定: auto fn = phx::bind(&FakeOne::field, k); 更新评论内容: #include <boost/phoenix.hpp> namespace phx = boost::phoenix; using namespace phx::local_names; struct FakeOne{ int field; }; auto k = F


您不能仅在占位符(如_a)上调用成员,因为它们不声明成员(如
字段
)。相反,将它们绑定:

auto fn = phx::bind(&FakeOne::field, k);
更新评论内容

#include <boost/phoenix.hpp>

namespace phx = boost::phoenix;
using namespace phx::local_names;

struct FakeOne{
    int field;    
};

auto k = FakeOne { 3 };

int main()
{
    auto fn = phx::bind(&FakeOne::field, k);

    k.field = 99;
    return fn();
}

“GCC—O3 O/P>P>菲尼克斯的λ函数是C++ 11λ”,不,它们不是。它们使用占位符替换值并生成表达式。但它们不是语言扩展,所以请注意编译器所说的:占位符
\u a
没有成员
字段
,这非常有意义。@Manu343726我以错误的方式将
k
传递给lambda?bind会产生一些开销吗?在编译时,是的。一个好的编译器应该将其与优化结合起来enabled@tower120我已经添加了一个独立的样品与拆卸为您的享受
auto fn = phx::bind(&FakeOne::field, k);
#include <boost/phoenix.hpp>

namespace phx = boost::phoenix;
using namespace phx::local_names;

struct FakeOne{
    int field;    
};

auto k = FakeOne { 3 };

int main()
{
    auto fn = phx::bind(&FakeOne::field, k);

    k.field = 99;
    return fn();
}
main:                     ; test.cpp:13
    movl    k(%rip), %eax ; boost/boost/proto/expr.hpp:65
    movl    $99, k(%rip)  ; test.cpp:16
    ret