![](/img/trans.png)
[英]boost::unsafe_any_cast invalid non-null pointer when empty?
[英]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個測試的輸出相同。 但事實並非如此。 為什么? 這是錯誤嗎? 嘗試增加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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.