代码之家  ›  专栏  ›  技术社区  ›  Veda

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

  •  0
  • Veda  · 技术社区  · 8 年前

    我有以下测试申请:

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   Sander De Dycker    8 年前

    boostAny2 是指向 boost::any . 把它作为参数传递给 check ,它期望 boos::any ,所以一个新的 boost::任意 实例是从 boost::any* (即,值类型将是 boost::任意* ). 裁判。 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 .

        2
  •  1
  •   john    8 年前

    你在暗中构造 any 包含您提供的指针的对象,因此它们显然不是空的。

    你的代码

    check(boostAny3);
    

    相当于这个代码

    check(any(boostAny3));
    

    我想你想要的是

    check(*boostAny3);
    
    推荐文章