【问题标题】:boost::any type change leading to illegal accessboost::any 类型改变导致非法访问
【发布时间】:2016-10-13 10:57:17
【问题描述】:

在通过 boost cpp 库书测试示例时,我注意到更改存储在 boost::any 变量中的类型可能会导致非法访问而不是异常:

好:

boost::any a = 1;
bool *p = boost::any_cast<bool>(&a); // ok, bad cast exception

不好:

boost::any a = std::string { "Boost" };
a = 1;
bool *p = boost::any_cast<bool>(&a); // no exception thrown
std::cout << std::boolalpha << *p << '\n'; // illegal access

因此,我的问题是:这看起来是一个错误,还是我不知道的与模板使用相关的一些潜在事实?

【问题讨论】:

  • “医生,当我这样移动我的手臂时很痛。” ......“好吧,不要那样移动你的手臂。”
  • v=boost::any a = 1; bool *p = boost::any_cast&lt;bool&gt;(&amp;a); // ok, bad cast exception 什么?不,这不会发生。
  • 谢谢,你是对的,正如 Ami Tavory 指出的那样,我正在查看错误的代码部分。然而,由于他的解释是合理的,我已经更新了问题中的代码。
  • @AlexC 我建议保留问题原样,以避免混淆。
  • @SauravSahu - 完成,希望这实际上不会将焦点从代码中的真正问题转移,这是 Ami 指出的

标签: c++ boost shared-ptr


【解决方案1】:

我对@9​​87654321@ 的理解不同:

返回:如果传递一个指针,如果成功则返回一个类似限定的指向值内容的指针,否则返回null。如果 T 是 ValueType,则返回保存值的副本,否则,如果 T 是对(可能是 const 限定的)ValueType 的引用,则返回对保存值的引用。

抛出: 采用 any 指针的重载不会抛出;如果不成功,采用 any 值或引用的重载会抛出 bad_any_cast

所以:

  1. 转换的成功或失败取决于存储的类型和目标类型。

  2. 不过,失败的表现取决于您是否传递了指向any_cast 的指针。如果传递一个指针,表现形式是nullptr;否则,表现形式例外。

以这段代码为例:

#include <boost/any.hpp>
#include <iostream>

int main() {
    boost::any a = 1;

这似乎与您问题中的陈述相矛盾 - 因为它需要一个指针,所以它不会抛出,但指针是 nullptr

    bool *p = boost::any_cast<bool>(&a); 
    // Prints true
    std::cout << std::boolalpha << (p == nullptr) << std::endl;

这是正常时的样子:

    int *q = boost::any_cast<int>(&a); 
    // Prints false
    std::cout << std::boolalpha << (q == nullptr) << std::endl;

这会抛出,因为它不需要指针:

    try {
        boost::any_cast<bool>(a);
    }
    catch(...) {
        std::cout << "caught" << std::endl;
    }

对于字符串存储类型也是如此:

    a = std::string { "Boost" }; 
    p = boost::any_cast<bool>(&a); 
    // Prints true
    std::cout << std::boolalpha << (p == nullptr) << std::endl;
    try {
        boost::any_cast<bool>(a);
    }
    catch(...) {
        std::cout << "caught again" << std::endl;
    }
}

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多