Boost.Phoenix本质上比等效的C++ 11 lambdas慢(它使用虚拟调用,'volatile'用法等)吗?

Meh*_*dad 6 c++ lambda boost visual-c++ boost-phoenix

我一直认为Boost.Phoenix使用类型推断来静态推断所有内容,直到我尝试这段代码:

#include <vector>
#include <boost/phoenix/phoenix.hpp>

using namespace boost::phoenix;
using namespace boost::phoenix::placeholders;

struct Foo { int x; };

int main()
{
    std::vector<int> bar;
    bind(&Foo::x, ref(bar)[_1])("invalid index");   // oops
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并得到警告:

警告C4239:使用非标准扩展:"参数":转换从const char [3]volatile const boost::proto::detail::anyns::any &
非const引用可以仅被绑定到一个左值

这让我感到惊讶.我没想到会看到any任何地方,更不用说了volatile!

这是否意味着Boost.Phoenix实际上本质上比其等效的C++ 11 lambdas慢(忽略我在这里使用的特定编译器)?

Igo*_* R. 2

不是Boost.Any,它any来自Boost.Proto实现细节 - 请参阅boost/proto/detail/decltype.hpp。它的运行时开销为零。