这是正确的行为

Is this a right behavior?

本文关键字:      更新时间:2023-10-16
class foo {
    std::vector<int> datas;
public:
    template <typename It>
    foo(It x, It y) {
        for(; x != y; ++x)
            insert(*x);
    }
    void insert(int val) {
        if(val == 5)
            throw 99;
        else
            datas.push_back(val);
    }
    void print() const {
        for(int x : datas)
            std::cout << x << " ";
    }
};
int main() {
    std::vector<int> v{1, 2, 3, 5, 6, 7};
    foo* f;
    try {
        f = new foo(std::begin(v), std::end(v));
    }catch(int const& x) {
    }
    f->print();
}

我想在这种情况下不会构建F;插入方法抛出的例外未在foo构造器的主体中处理。我在GCC 8.2.0上得到以下输出:1 2 3 5 6 7

我想在这种情况下不会构建f;

在这种情况下不会构建foo实例。

此外,f不会被分配给,因此其值将保持不确定。

这是正确的行为吗?

通过不确定的指针间接访问对象的行为不确定。

虽然已经讨论了未定义的性质,但我觉得研究实际产生的结果并推测我们为什么看到它可能很有趣。

虽然我没有证据,但我认为这是编译器优化和代码推理的有趣结果。我们看到输出是1 2 3 5 6 7,即使代码对元素5具有throw语句。这将如何发生?

在我看来,由于我们在try块之外有f->print(),因此f永远不会非直接化的编译器原因 - 因此构造函数永远不会投掷。由于构造函数永远不会抛出,因此val == 5永远都不正确!因此,分支被删除。因此,我们得到了我们的结果。

相关文章:
  • 没有找到相关文章