Boost::any 从指针使用时不为空
Boost::any not empty when used from a pointer
我有以下测试应用程序:
#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 个测试的输出相同。但事实并非如此。为什么?这是一个错误吗?尝试使用 boost 1.54.0 和 1.55.0.
boostAny2
是指向 boost::any
的指针。您将它作为参数传递给 check
,它需要一个 boos::any
,因此从 boost::any*
创建一个新的 boost::any
实例(即值类型将是 boost::any*
).参考https://www.boost.org/doc/libs/release/doc/html/boost/any.html
或者换句话说,实际发生的事情(概念上)是:
boost::any* boostAny2 = &boostAny;
boost::any param = boost::any(boostAny2); // contruct a new boost::any instance from the pointer boostAny2
check(param);
也许你的意思是:
check(*boostAny2);
同样适用于boostAny3
。
您正在隐式构造 any
包含您提供的指针的对象,因此显然它们不是空的。
您的代码
check(boostAny3);
相当于这段代码
check(any(boostAny3));
我想你想要的是
check(*boostAny3);
我有以下测试应用程序:
#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 个测试的输出相同。但事实并非如此。为什么?这是一个错误吗?尝试使用 boost 1.54.0 和 1.55.0.
boostAny2
是指向 boost::any
的指针。您将它作为参数传递给 check
,它需要一个 boos::any
,因此从 boost::any*
创建一个新的 boost::any
实例(即值类型将是 boost::any*
).参考https://www.boost.org/doc/libs/release/doc/html/boost/any.html
或者换句话说,实际发生的事情(概念上)是:
boost::any* boostAny2 = &boostAny;
boost::any param = boost::any(boostAny2); // contruct a new boost::any instance from the pointer boostAny2
check(param);
也许你的意思是:
check(*boostAny2);
同样适用于boostAny3
。
您正在隐式构造 any
包含您提供的指针的对象,因此显然它们不是空的。
您的代码
check(boostAny3);
相当于这段代码
check(any(boostAny3));
我想你想要的是
check(*boostAny3);