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