打印未初始化的参考文献给出1.为什么?

时间:2013-12-03 20:00:48

标签: c++ exception c++11 reference

这是我之前的问题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的结果还是仅仅是未定义的行为?我真的很想知道。感谢。

1 个答案:

答案 0 :(得分:4)

由于r永远不会被初始化,因为要初始化它的函数会抛出异常,所以您正在打印未初始化的引用,这将是未定义的行为。