Boost ::从指针使用时不为空

时间:2018-07-26 09:40:19

标签: c++ boost boost-any

我有以下测试应用程序:

#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增强。

2 个答案:

答案 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);