我有以下测试应用程序:
#include <boost/any.hpp>
#include <iostream>
void check(boost::any y)
{
if (y.empty())
std::cout << "empty!\n";
else
std::cout << "Not empty, type: " << y.type().name() << "\n";
}
int main()
{
boost::any boostAny;
check(boostAny);
boost::any* boostAny2 = &boostAny;
check(boostAny2);
boost::any* boostAny3 = new boost::any;
check(boostAny3);
delete(boostAny3);
}
我这样编译并运行:
g++ -std=c++11 -o test test.cpp && ./test
输出为:
empty!
Not empty, type: PN5boost3anyE
Not empty, type: PN5boost3anyE
我希望所有3个测试都具有相同的输出。但事实并非如此。为什么?这是错误吗?尝试使用1.54.0和1.55.0增强。
答案 0 :(得分:1)
boostAny2
是指向boost::any
的指针。您将其作为参数传递给check
,该参数需要boos::any
,因此将从boost::any
创建一个新的boost::any*
实例(即,值类型将为{{1 }})。参考https://www.boost.org/doc/libs/release/doc/html/boost/any.html
换句话说,实际上是在(概念上)发生:
boost::any*
也许您是说:
boost::any* boostAny2 = &boostAny;
boost::any param = boost::any(boostAny2); // contruct a new boost::any instance from the pointer boostAny2
check(param);
check(*boostAny2);
也是如此。
答案 1 :(得分:1)
您正在隐式构造包含您提供的指针的any
对象,因此显然它们不是空的。
您的代码
check(boostAny3);
等同于此代码
check(any(boostAny3));
我想你想要的是
check(*boostAny3);