这是正确的行为
Is this a right behavior?
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
永远都不正确!因此,分支被删除。因此,我们得到了我们的结果。
相关文章:
- 没有找到相关文章