6

我一直认为 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;
}

并收到警告:

警告 C4239:使用了非标准扩展:'argument':从转换const char [3]为非volatile const boost::proto::detail::anyns::any &
const 引用只能绑定到左值

这让我很惊讶。我没想到会在any任何地方看到,更不用说volatile

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

4

2 回答 2

2

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

于 2012-07-22T13:22:14.837 回答
0

我希望 Boost.Phoenix 比等效的 C++11 lambda 慢。该bind函数获取稍后调用的函数的地址,因此编译器将比使用直接调用所需函数的 lambda 更难内联生成的函数调用。

我在这里指的开销是间接调用函数的开销,足够智能的编译器可以将其删除,但我不确定是否有任何编译器实际上为 Boost.Phoenix 执行此操作。

于 2013-02-28T05:55:03.117 回答