这是我之前的问题Why is my exception still being thrown after being caught?
的后续问题我有一个类r
的参考数据成员S
,它试图使用函数调用f
的结果进行初始化。 f
抛出所以我设置了一个try-catch块。我不希望r
被赋予一个值,因为在函数返回之前抛出了异常。但是当我在catch块中打印出r
时,我得到了1
。
#include <iostream>
#include <stdexcept>
int& f() { throw std::invalid_argument("invalid"); static int i(50); return i; }
struct S
{
S()
try : r(f())
{ }
catch(...)
{
std::cout << r;
}
int& r;
};
int main()
{
try { S s; } catch(...) { }
}
输出:
1
我不知道为什么我得到1而不是随机值或0如常规变量。是标准规定的1的结果还是仅仅是未定义的行为?我真的很想知道。感谢。
答案 0 :(得分:4)
由于r
永远不会被初始化,因为要初始化它的函数会抛出异常,所以您正在打印未初始化的引用,这将是未定义的行为。